Вы пытаетесь использовать diff
для дифференциации функции. Готовый diff
выполняет разностную операцию между парами элементов. Вы не хотите этого. Вместо этого сделайте свои f
и fp
действительными функциями. Сначала создайте символическое определение вашей функции f
, то дифференцировать это символическое представление с использованием символической версии diff
(который вы можете просто позвонить с самого diff
), а затем создать функцию MATLAB с matlabFunction
из этого:
%// Define symbolic variable
syms x;
%// Define function symbolically
y = tan(x) - 2*x;
%// Define function handles (numerical) to the original and derivative
f = matlabFunction(y);
fp = matlabFunction(diff(y));
%// Now call Newton's Method
[y, iter] = newton(f, fp, 1.4);
Обратите внимание, что f
и fp
уже являются функциональными ручками. Это то, что возвращает matlabFunction
, поэтому нет необходимости создавать дескриптор через @
в качестве входов в функцию метода Newton's больше.
Запуск этой модификации в код, я получаю это для корня с начальным предположением на x = 1.4
и количество итераций, которое потребовалось:
>> format long g
>> y
y =
1.16556118520721
>> iter
iter =
8
Если Символическая Математика Toolbox отсутствует .. .
Если у вас нет набора символов Symbolic Mathematics Toolbox, то то, что я предложил, не будет работать. Таким образом, у вас нет выбора, кроме как использовать дискретную аппроксимацию производной, чтобы заставить ее работать. Тем не менее, мы все еще можем работать с кодом, который я написал выше, но fp
придется определять по-разному.
Если вы помните, определение производной таково, что:
Чтобы получить эту работу в дискретном случае, вы делаете Δx
очень маленький ... что-то вроде 1e-10
, например.
Таким образом, вы могли бы сделать это вместо того, чтобы с анонимными функциями:
%// Define function
f = @(x) tan(x) - 2*x;
%// Define derivative
h = 1e-10;
fp = @(x) (f(x + h) - f(x))/h;
%// Now call Newton's Method
[y, iter] = newton(f, fp, 1.4);
С этим, я получаю:
>> format long g;
>> y
y =
1.16556118520721
>> iter
iter =
8
Я бы сказал, что это чертовски близко!
Функция 'diff' возвращает разность между элементами в векторе. См. diff>. Вы должны получить как минимум два значения при вызове 'fp' –