2015-12-12 279 views
1

我想编写一个脚本来生成一个[-2,2] x [-2,2] x [-2, 2]框在3D空间。MATLAB上的3D矢量场

我有一个单独的.m文件函数定义如下:

function[Dx,Dy,Dz]= question3function(Q,Loc,XX,YY,ZZ) 

Q=1e-6; 
Loc=[]; 

XX=(2,-2); 
YY=[2,-2]; 
ZZ=[2,-2]; 

% Position vector from the point charge 
Rx=(XX)-Loc([]); 
Ry=(YY)-Loc([]); 
Rz=(ZZ)-Loc([]); 

% Distance between position in interest and the point charge 
R=sqrt(Rx.*Rx+Ry.*Ry+Rz.*Rz); 

% Unit Position vector 
Ax=Rx./R; 
Ay=Ry./R; 
Az=Rz./R; 

% Electric flux density XYZ components 
K=Q./(4*pi*R.^2); 
Dx=K.*Ax; 
Dy=K.*Ay; 
Dz=K.*Az; 

然后在我的主脚本我有函数调用:

%function calls 
[Dx1,Dy1,Dz1]=question3function(Q,[1 1 1],XX,YY,ZZ); 
[Dx2,Dy2,Dz2]=question3function(Q,[1 1 -1],XX,YY,ZZ); 
[Dx3,Dy3,Dz3]=question3function(Q,[1 -1 1],XX,YY,ZZ); 
[Dx4,Dy4,Dz4]=question3function(-Q,[1 -1 -1],XX,YY,ZZ); 
[Dx5,Dy5,Dz5]=question3function(2*Q,[-1 1 1],XX,YY,ZZ); 
[Dx6,Dy6,Dz6]=question3function(-2*Q,[-1 1 -1],XX,YY,ZZ); 
[Dx7,Dy7,Dz7]=question3function(-Q,[-1 -1 1],XX,YY,ZZ); 
[Dx8,Dy8,Dz8]=question3function(-Q,[-1 -1 1],XX,YY,ZZ); 

Dx=Dx1+Dx2+Dx3+Dx4+Dx5+Dx6+Dx7+Dx8; 
Dy=Dy1+Dy2+Dy3+Dy4+Dy5+Dy6+Dy7+Dy8; 
Dz=Dz1+Dz2+Dz3+Dz4+Dz5+Dz6+Dz7+Dz8; 

quiver3(XX,YY,ZZ,Dx,Dy,Dz); 
axis square equal; 
xlabel('X'); ylabel('Y'); zlabel('Z'); 
title('Electric Flux Density of the sum of 8 Point Charges'); 

我收到以下错误时,我尝试运行我的功能文件:

??? Error using ==> minus 
Matrix dimensions must agree. 

Error in ==> question3function at 11 
    Rx=(XX)-Loc([]); 

有人可以帮我解释一下在我如何解决这个问题?我将补充一点,我对使用MATLAB不太熟悉。

+0

您使用'Loc'作为函数'question3function'的输入参数,但您也在第4行重新定义它。此外,您使用括号代替方括号来定义XX。 MATLAB编辑器窗口的右侧(滚动条)应该突出显示您可能已经完成的一些错误。至于你的错误:你试图做的似乎是从彼此中减去具有不同长度的向量,这是线性代数中的无效操作。 – Tom

回答

0

有一些毫无意义的东西,你在这里做:

function[Dx,Dy,Dz]= question3function(Q,Loc,XX,YY,ZZ) 

Q=1e-6; % this is meaningless 
Loc=[]; % this is meaningless 

XX=(2,-2); % this is meaningless() 
YY=[2,-2]; % this is meaningless 
ZZ=[2,-2]; % this is meaningless 

% Position vector from the point charge 
Rx=(XX)-Loc([]); % this is meaningless ([]) 
Ry=(YY)-Loc([]); % this is meaningless ([]) 
Rz=(ZZ)-Loc([]); % this is meaningless ([]) 

% Distance between position in interest and the point charge 
R=sqrt(Rx.*Rx+Ry.*Ry+Rz.*Rz); 

% Unit Position vector 
Ax=Rx./R; 
Ay=Ry./R; 
Az=Rz./R; 

% above why do you need all of them to be unit vectors 
% you can 
% Electric flux density XYZ components 
K=Q./(4*pi*R.^2); 
Dx=K.*Ax; 
Dy=K.*Ay; 
Dz=K.*Az; 

而且,在%function calls如何定义XXYYZZ

0

你的函数声明的后半部分是合理的,但是你错过了函数的工作方式。函数参数的要点是函数使用这些变量作为输入。分配给输入参数通常是一个语义错误:它通常不是你想要做的。另一个问题是,在matlab向量用方括号定义,并坦率地(2,-2)应该给你一个关于不平衡括号的错误... 总是请务必检查您的代码,然后发布有关堆栈溢出的问题:如果您更改它在发布之前,您可能无意中删除了原始问题。

您可以通过在开始时删除多余的变量重新定义并将作业固定为Rx/Ry/Rz来使用原始函数。当你说Loc([])时,你使用一个空向量索引,结果是一个空变量。这显然不是你需要的。相反:

function [Dx,Dy,Dz]=question3function(Q,Loc,XX,YY,ZZ) 

%Q, Loc, XX, ZZ, YY: input! 

% Position vector from the point charge 
Rx = XX - Loc(1); %use first component of Loc for every x 
Ry = YY - Loc(2); %use second component of Loc for every y 
Rz = ZZ - Loc(3); %use third component of Loc for every z 

% Distance between position in interest and the point charge 
R=sqrt(Rx.^2+Ry.^2+Rz.^2); % .^2 takes less characters 

% Unit Position vector 
Ax=Rx./R; 
Ay=Ry./R; 
Az=Rz./R; 

% Electric flux density XYZ components 
K=Q./(4*pi*R.^2); 
Dx=K.*Ax; 
Dy=K.*Ay; 
Dz=K.*Az; 

那么你应该定义XXYYZZ,在你调用函数/脚本QLoc

%define mesh 
N = 5; % number of points for mesh in each dimension 
[XX,YY,ZZ] = meshgrid(linspace(-2,2,N)); 

%define charges and locations in arrays 
Q0 = 1e-6; 
Qvec = Q0*[1 1 1 -1 2 -2 -1 -1]; 
Locmat = [1 1 1; 1 1 -1; 1 -1 1; 1 -1 -1;... 
     -1 1 1; -1 1 -1; -1 -1 1; -1 -1 1]; % last 2 are duplicates!! 

%function calls in loop, keep adding up flux components 
Dx=zeros(size(XX)); 
Dy=zeros(size(XX)); 
Dz=zeros(size(XX)); 

for k=1:length(Qvec) 
    Q = Qvec(k); 
    Loc = Locmat(k,:); 
    [Dxtmp, Dytmp, Dztmp] = question3function(Q,Loc,XX,YY,ZZ); 
    Dx = Dx + Dxtmp; 
    Dy = Dy + Dytmp; 
    Dz = Dz + Dztmp; 
end 

%plot, no changes here  
quiver3(XX,YY,ZZ,Dx,Dy,Dz); 
axis square equal; 
xlabel('X'); ylabel('Y'); zlabel('Z'); 
title('Electric Flux Density of the sum of 8 Point Charges'); 

输出:

另外,如果你只在总光通量密度有兴趣,你可以在一个循环中定义的数组每次收费和自己的位置,并在调用函数顾得上键盘时

output of quiver3