Все основные части присутствуют в коде настоящего.Однако есть некоторые проблемы.
Основная проблема заключается в том, что конкатенация строк создает переменную в рабочей области;Это не.Основной виновник - эта строка:
['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.
).
Мой ответ, эти другие могут отличаться, будет
- Преобразовать символические функции в дескрипторы с помощью
matlabFunction
(поскольку метод Нетвона почти всегда является числовой реализацией, символические функции должны быть пропущены один разрезультат их использования завершен) - Замените создание строк двойным массивом для
x
(намного, намного чище, быстрее и в целом лучше кода). - Поместите
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