2015-11-05 187 views
-2

我想運行我的功能。它顯示輸入參數太多錯誤

[root, ni]=value1(xu,xl,acceptable) 
Error using value1 
Too many input arguments. 
function[root, ni]=value1(xu,xl,acceptable) 
    fu=HW10B(xu); 
    fl=HW10B(xl); 
    Err=1; 
    N=0; 
    if fu*fl>=0 
    end 
    while Err>=acceptable; 
     m=(xu+xl)/2; 
     fm=HW10B(m) 
     if fm*fu<0; 
      fl=m; 
     else fu=m; 
      Err=abs(xu-xl)/xu*100; 
     end 
     N=N+1; 
    end 

function [ y] = HW10B(x) 
%equation of x 
y=3*x^3-8*x^2-4*x+9; 
end 

root=m; 
ni=N; 
end 
+0

我保存了2分鐘:HW10B.m和value1.m –

+0

你打電話給'value1'怎麼辦?你的工作空間中有一個名爲'value1'的變量嗎? – excaza

+0

'xu'和'xl'都應該是標量,應該是'可以接受的'。你想給你的功能提供什麼? – Adriaan

回答

1
function[m, N]=value1(xu,xl,acceptable) 
[email protected](x)3*x.^3-8.*x.^2-4.*x+9;%//Used anonymous function instead of private 
fu=y(xu);%//Used above definition 
fl=y(xl); 
Err=1;%//Initialise error 
N=0;%//Initialise counter 
while Err>=acceptable && N<1e4;%//check for convergence 
    m=(fu+fl)/2;%//Get new midpoint 
    fm=y(m);%//Get value at midpoint 
    if fm*fu<0;%//Get left or right value to move 
     fl=m; 
    else 
     fu=m; 
     Err=abs(fu-fl)/fu*100;%//Calculate the error 
    end 
    N=N+1;%//Update iteration counter 
end 
end 

從命令行調用它:

xu=15;xl=2;acceptable=1e-3; 
[root, ni]=value1(xu,xl,acceptable) 
root = 
    2.7554 
ni = 
    29 

正如你可以看到我清理您的代碼不少。在代碼末尾使用兩個獨立的存儲變量只佔用了比必要的更多的空間。 if陳述fu*fl>0沒有做任何事情,因此我把它找出來了。最後,您需要更新函數中的值,因此使用flfxfm,而不是xuxl

如果您從命令行向您展示的函數剛好(使用您自己的值),它不應該拋出任何錯誤。

原始代碼中會發生什麼情況是,您爲輸入變量計算一次所有內容,得到的錯誤大於acceptable,因此會重新執行,採用相同的輸入參數,返回的錯誤與之前一樣大於acceptable。這就是我們所說的無限循環。我建議你檢查它使用迭代的最大數量,即

while Err>=acceptable && N<1e4 

,改變1e4你想有什麼最大迭代次數。如果你不小心結束了無限期的話,那麼這個計數器就會殺死它,而不必訴諸於crtl-c或等同物。