迭代变量时的牛顿拉夫森方法问题

我需要解决问题。我编写了一个程序,使用牛顿拉夫森方法来计算函数的值。但是,该函数还有一个变量,我想对其进行迭代,V。程序可以正常运行,直到外部for循环的第二次迭代为止,然后一旦到达Newton Raphson函数,内部for循环将不再运行。如果有人对错在哪里有任何想法,我将不胜感激。我得到的错误是:警告:解决方案不存在,因为系统不一致。

以下代码详细说明。


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,x0)); 

        y=x0-f0/f0_der; % Newton Raphson

        x0=y;
end
end
akinschen 回答:迭代变量时的牛顿拉夫森方法问题

假设您定义的函数类似

func = @(x,V) V+x+exp(x);

有很多选项可以避免昂贵的符号计算。

首先,使用x0fzero循环制作for值的向量:

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

至少在循环中效率更高,因为它仅使用匿名函数。

本文链接:https://www.f2er.com/3121227.html

大家都在问