2017-09-06 216 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

谢谢大家。是的,我意识到错误问题,并且这些更改会很好,但不幸的是我已经给出了这个任务,并且输出是必需的。谢谢你,至少我现在至少没有得到那个错误。我改变了最后一部分,但没有得到字符串 –