2017-03-09 36 views
1

我对Matlab的知识非常有限,我试图做一个普通的牛顿Raphson函数,但每次出现错误说没有足够的输入参数。我的代码需要三个输入,f(函数),c0(初始猜测)和n(步数)。这是到目前为止我的代码:通用牛顿方法函数文件Matlab

function [c] = Q3(f,c0,n) 


for i=1:n 

c(0)=c0; 
f=f(x); 
fp=diff(f,x); 

c(i)=c(i-1)-subs(f,x,c(i-1))/subs(fp,c(i-1)); 

end 


disp(c) 

我已经这个函数写在脚本文件

[email protected](x)(sin((pi.*x)/2)+(1/x)-(10.*x)); 

然后把这到命令窗口并[c] = Q3(G(X),1 ,n)希望它能工作,但显然我的代码需要工作。 感谢

+0

该代码是错误的。 'subs'用于符号替换,如果你想评估函数,你需要做'f(c(i-1))'。除其他事项外......大部分代码都是错误的。 –

+1

可能唯一缺少的是在'f = f(x)'之前声明'x'作为符号,以便正确地将'f'从函数改为符号表达式。 – LutzL

+0

@LutzL是的,但是NR是一种数字方法,所以拥有一个NR符号并不是一个非常聪明的想法。如果你有象征性的表达,你可以用'solve'来解决它。 –

回答

0

这应该做的伎俩,函数g定义为你指出:

[email protected](x)(sin((pi.*x)/2)+(1/x)-(10.*x));

但你也应该定义nc0,例如:

clearvars 

[email protected](x)(sin((pi.*x)/2)+(1/x)-(10.*x)); 

n=10 
c0=1 

c=Q3(g,c0,n) 

而且在另一个文件中,您可以编写NR的功能:

function [c] = Q3(f,c0,n) 

h=1e-4; 
c(1)=c0; 

for i=1:n 
    g=f(c(i)); 
    gp=(f(c(i)+h)-f(c(i)-h))/(2*h) 
    c(i+1)=c(i)-g/gp 
end 

disp(c) 

在这种情况下,我选择h=1e-4作为数值导数近似值,但您可以更改它。我建议h<1e-2