Matlab 迭代变量时的Newton-Raphson方法问题

Matlab 迭代变量时的Newton-Raphson方法问题,matlab,symbolic-math,Matlab,Symbolic Math,我需要帮助解决一个问题。我编写了一个程序,用牛顿-拉斐逊法计算一个函数的值。但是,函数还有一个变量,我想迭代,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。程序运行良好,直到外部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)

最后,如果你想用牛顿法的十个步骤,象征性地计算导数(尽管这不是一个很好的方法)


这至少在循环中会更有效,因为它只是使用匿名函数。

为什么你使用符号数学,因为你只是得到一个近似值,为什么不使用数值变量?我还没有考虑任何其他的选择。你知道我怎样才能得到一个数值程序吗?试试
fzero
。或者对
f
g
使用匿名函数,你可以这样做
f(x0)
。使用fzero和匿名函数,我并没有什么进展。。。你有什么具体的例子来说明我如何实现它吗?讽刺的是,你没有给我们一个你想要解决的具体例子。。。请提供一份包含给定输入的预期输出的报告。
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