Метод Ньютона в Matlab - PullRequest
       7

Метод Ньютона в Matlab

0 голосов
/ 26 января 2019

Я пытаюсь применить метод Ньютона в Matlab, и я написал скрипт:

syms f(x)
f(x) = x^2-4
g = diff(f)
x_1=1 %initial point
while f(['x_' num2str(i+1)])<0.001;% tolerance
    for i=1:1000 %it should be stopped when tolerance is reached
       ['x_' num2str(i+1)]=['x_' num2str(i)]-f(['x_' num2str(i)])/g(['x_' num2str(i)])
    end
end

Я получаю эту ошибку:

   Error: An array for multiple LHS assignment cannot contain M_STRING.

Формула метода Ньютона: x_ (n+1) = x_n-f (x_n) / df (x_n), который идет до тех пор, пока значение f (x_n) не приблизится к нулю.

1 Ответ

0 голосов
/ 26 января 2019

Все основные части присутствуют в коде настоящего.Однако есть некоторые проблемы.

Основная проблема заключается в том, что конкатенация строк создает переменную в рабочей области;Это не.Основной виновник - эта строка:

['x_' num2str(i+1)]=['x_' num2str(i)]-f(['x_' num2str(i)])/g(['x_' num2str(i)])

['x_' num2str(i+1)] является строкой, и язык MATLAB не поддерживает присваивание массивам символов (что является моей интерпретацией An array for multiple LHS assignment cannot contain M_STRING.).

Мой ответ, эти другие могут отличаться, будет

  1. Преобразовать символические функции в дескрипторы с помощью matlabFunction (поскольку метод Нетвона почти всегда является числовой реализацией, символические функции должны быть пропущены один разрезультат их использования завершен)
  2. Замените создание строк двойным массивом для x (намного, намного чище, быстрее и в целом лучше кода).
  3. Поместите if -тест с break в for -цикле против текущей конструкции.

Мои предложения, реализованные, будут выглядеть так:

syms f(x)
f(x) = x^2-4;
g = diff(f);

f = matlabFunction(f);
g = matlabFunction(g);

nmax = 1000;
tol = 0.001;% tolerance
x = zeros(1, nmax);
x(1) = 1; %initial point

fk = f(x(1));
for k = 1:nmax
    if (abs(fk) < tol)
        break;
    end

    x(k+1) = x(k) - f(x(k))/g(x(k));
    fk = f(x(k));

end
...