迭代变量时的Newton Raphson方法问题
Newton Raphson method problem when iterating a variable
我需要帮助解决一个问题。我编写了一个程序来使用 Newton Raphson 方法计算函数的值。但是,该函数还有一个我想迭代的变量 V。程序 运行 在外部 for 循环的第二次迭代之前都很好,然后内部 for 循环将不会再 运行 一次它达到 Newton Raphson 函数。如果有人对错误有任何想法,我将不胜感激。我得到的错误是:警告:解决方案不存在,因为系统不一致。
详细代码如下。
for V = 1:50;
syms x;
f(V)= Il-x-Is.*(exp((q.*(V+x.*Rs))./(1000.*y.*K.*T))-1)-((V+x.*Rs)./Rsh);
g(V)=diff(f(V));
x0 = 0;
i = 1;
for i=1:10
f0=vpa(subs(f,x,x0));
f0_der=vpa(subs(g,x,x0));
y=x0-f0/f0_der; % Newton Raphson
x0=y;
end
end
假设你定义了一个函数
func = @(x,V) V+x+exp(x);
有很多选项可以避免昂贵的符号计算。
首先,使用 fzero
和 for
循环制作 x0
值的向量:
for V = 1:50
x0(V) = fzero(@(x) func(x,V),0);
end
其次,同样的事情又写成匿名函数,所以你可以调用 x0(1.5)
或 x0(1:50)
:
x0 = @(V) arrayfun(@(s) fzero(@(x) func(x,s),0),V);
最后,如果你想用十步牛顿法,用符号求导(虽然这不是什么好方法),
syms y Vsym
g = matlabFunction(diff(func(y,Vsym),y),'Vars',[y Vsym]);
for V = 1:50
x0(V) = 0;
for i = 1:10
x0(V) = x0(V)-func(x0(V),V)/g(x0(V),V); % Newton Raphson
end
end
至少在循环中会更有效率,因为它只使用匿名函数。
我需要帮助解决一个问题。我编写了一个程序来使用 Newton Raphson 方法计算函数的值。但是,该函数还有一个我想迭代的变量 V。程序 运行 在外部 for 循环的第二次迭代之前都很好,然后内部 for 循环将不会再 运行 一次它达到 Newton Raphson 函数。如果有人对错误有任何想法,我将不胜感激。我得到的错误是:警告:解决方案不存在,因为系统不一致。
详细代码如下。
for V = 1:50;
syms x;
f(V)= Il-x-Is.*(exp((q.*(V+x.*Rs))./(1000.*y.*K.*T))-1)-((V+x.*Rs)./Rsh);
g(V)=diff(f(V));
x0 = 0;
i = 1;
for i=1:10
f0=vpa(subs(f,x,x0));
f0_der=vpa(subs(g,x,x0));
y=x0-f0/f0_der; % Newton Raphson
x0=y;
end
end
假设你定义了一个函数
func = @(x,V) V+x+exp(x);
有很多选项可以避免昂贵的符号计算。
首先,使用 fzero
和 for
循环制作 x0
值的向量:
for V = 1:50
x0(V) = fzero(@(x) func(x,V),0);
end
其次,同样的事情又写成匿名函数,所以你可以调用 x0(1.5)
或 x0(1:50)
:
x0 = @(V) arrayfun(@(s) fzero(@(x) func(x,s),0),V);
最后,如果你想用十步牛顿法,用符号求导(虽然这不是什么好方法),
syms y Vsym
g = matlabFunction(diff(func(y,Vsym),y),'Vars',[y Vsym]);
for V = 1:50
x0(V) = 0;
for i = 1:10
x0(V) = x0(V)-func(x0(V),V)/g(x0(V),V); % Newton Raphson
end
end
至少在循环中会更有效率,因为它只使用匿名函数。