2015-12-12 260 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