Проблема метода Ньютона-Рафсона при итерации переменной - PullRequest
0 голосов
/ 12 ноября 2019

Мне нужна помощь с проблемой. Я написал программу для вычисления значения функции, используя метод Ньютона Рафсона. Однако у функции также есть переменная, которую я хотел бы перебрать, V. Программа работает нормально до второй итерации внешнего цикла for, тогда внутренний цикл 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,x,x0)); 

        y=x0-f0/f0_der; % Newton Raphson

        x0=y;
end
end

1 Ответ

0 голосов
/ 13 ноября 2019

Предполагая, что у вас есть функция, определенная как

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

Существует множество опций, позволяющих избежать дорогостоящих символических вычислений.

Во-первых, создание вектора значений x0 с использованием fzero и цикл 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);

Наконец, если вы хотите использовать десять шагов метода Ньютона и вычислить производную символически (хотя это не очень хороший метод), * ​​1017 *

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

Что по крайней мере будет более эффективным в циклах, потому что это простоиспользуя анонимные функции.

...