2017-10-04 23 views
0
function p = newton_hw(p0,tol,Nmax) 

%NEWTON'S METHOD: Enter f(x), f'(x), x0, tol, Nmax 
f = @(x) x*cos(x)-((sin(x))^2); 
fp= @(x) -x*sin(x)+ cos(x)-2*sin(x)*cos(x); 
p = p0 - (f(p0)/fp(p0)); 
y1=f(p); 
fprintf('y1=%f',y1) 
i = 1; 
while (abs(p - p0) >= tol) 

    p0 = p; 
    p = p0 - f(p0)/fp(p0); 
    i = i + 1; 
    if (i >= Nmax) 
     fprintf('Fail after %d iterations\n',Nmax); 
     break 
    end 

    y=f(p); 
    fprintf('a=%f,y=%f,\n',p,y); 
end 

end 

的牛頓迭代這是我的問題:如何找到每個初始點

如何循環訪問爲每個p0 = 0,.1,.2,...,49,5

+0

如何遍歷間隔I = [0,5],每0.1 –

回答

1

使用迭代用戶的步驟可以做到這樣:

for i = 0:0.1:5 

而且任何索引可以做同樣的方式:x = [0:2:50]

如果你的功能才能正常工作(我想是這樣),我們可以這樣說:

k = 1; 
for i = 0:0.1:5 
res(k) = newton_hw(i,0.001,1000); 
k = k+1; 
end 

但是,我們也可以在一行做到這一點 - 風格:

res = arrayfun(@(x) newton_hw(x, 0.001, 1000), I) 
+0

任何建議在哪裏插入for循環到我的程序?還是我需要用for循環創建新程序? –

+0

'arrayfun'不是矢量化代碼FYI。 – rayryeng

+0

@AlqoshHazkeal有三種常用的方式來使用它: 1.將函數另存爲.m文件,並使用相同的名稱(newton_hw.m),然後將其用於腳本或其他函數中(它們必須位於相同的目錄中) 2.您可以使用它作爲本地功能:在這裏查看更多關於它https://www.mathworks.com/help/matlab/matlab_prog/local-functions.html 3.如果你使用2016b或更新,你可以在腳本文件中創建函數:看這裏https://www.mathworks.com/help/matlab/matlab_prog/local-functions-in-scripts.html –