2017-09-06 59 views
0

我想完成下面的代碼是一個迭代代碼。是的,我終於開始工作了,但是當我把這些規定放在了旗幟,發現和底部時。與else語句錯誤(輸出參數)的matlab迭代

我現在得到「輸出參數」錯誤「(也可能是其他人)在調用」jacobi「期間未分配。

我知道它與標誌= 0而不是1的else語句有關,因爲一切工作正常,直到我試圖把其他編碼放入並且現在 我得到這個錯誤。任何幫助將非常感激。

當我進入代碼它的工作原理與正確的答案和矩陣 值。當我在if if flag = 1的時候,它會跳到else部分,打印出我希望它打印出來的所有內容,然後當綠色箭頭進入最後一個結束語並帶有函數時,我會彈出 點擊下一步,它會發出上述錯誤。

它怎麼能一直工作到最後的結束語。我必須缺少 的東西。我對此很陌生,所以如果這件事很簡單,請原諒我。

function [x error niter flag ] =jacobi(A,x,b,maxiter, tol) 


if isrow(x)==1 
    x=x'; 
end 

if isrow(b)==1 
    b=b'; 
end 

if n ~= m    
    disp('The matrix has to be square for this function, please enter a 
    matrix that is sqaure'); 
end 



index=1; 
Dinv= inv(diag(diag(A))); 
D=diag(diag(A)); 
flag=0; 
y=x; 

while index <= maxiter 
    z = Dinv*((D-A)*y+b); 
     if norm(z-y)<tol 
      flag=1; 
      err=abs(norm(z-y)); 
     break 
    end 
    y=z; 
    index=index+1; 
end 


if flag==1 
    niter=index; 
    x=z; 
    error=err; 
else 
    maxindex='you have reached the maximum iterations of %d which is larger 
    than %d.'; 
     niter=index; 
     maxiter=maxiter; 
     sprintf(maxindex,niter,maxiter); 
end 






end 
+0

當'flag'爲0,則表示沒有分配任何東西'error',所以函數不知道該輸出什麼。你必須改變該變量的名稱,「錯誤」是一個保存的詞,並可能導致不可預知的行爲。 – Adiel

回答

0

你的問題是,您所指定的輸出:

[x error niter flag ] 

但如果你去到else語句,你是不是定義,x也不error,因此不能輸出這些變量。請注意,沒有設定x在技術上不會產生良率和錯誤,因爲您將其作爲輸入,但輸出x等於輸入x

個人而言,我寧願它蒙上了警告版本:

niter=index; 
x=z; 
error=err; 
if flag==0 
    warning(strcat('You have reached the maximum iterations of , int2str(niter),' which is larger than ',int2str(maxiter))); 
end 

,而不是

if flag==1 
    niter=index; 
    x=z; 
    error=err; 
else 
    maxindex='you have reached the maximum iterations of %d which is larger 
    than %d.'; 
    niter=index; 
    maxiter=maxiter; 
    x=z; 
    error=err; 
    sprintf(maxindex,niter,maxiter); 
end 
+0

'x'不是問題,他把它當作輸入。 – Adiel

+0

好吧,錯誤地說,你是對的,但我想這仍然不是他想要返回的x值,因此我提到了它。 –

+0

謝謝大家。是的,我意識到錯誤問題,並且這些更改會很好,但不幸的是我已經給出了這個任務,並且輸出是必需的。謝謝你,至少我現在至少沒有得到那個錯誤。我改變了最後一部分,但沒有得到字符串 –