2015-05-04 4 views
1

У меня есть приведенный ниже код matlab для метода Newton raphson.Метод Ньютона Рафсона

a=1;b=4;c=-2;d=0;h=0.5;t=1; 
x0 = -0.5+2i; 
i = 1; 
N = 100;    %maximum number of iterations 
tol = 1e-4;   %precision required 

syms x 
p = @(x) x^2+a*x+b-c*exp(-x*h)-d*exp(-x*t); 
f = @(x) a*x+b-lambertw(a*x+b-p*exp(a*x+b)); %function we are solving 
df = diff(f);   %differential of f(x) 

while i <= N 
    numf = subs(f,x,x0); %// Numerator - Substitute f(x) for f(y) 
    denf = subs(df,x,x0); 
    x = x0-double(numf)/double(denf);  %Newton-Raphson method 
    if (abs(x - x0)/abs(x))>tol  %stopping criterion 
    fprintf('Solution is %f \n', double(x)) 
    return 
end 
i = i + 1; 
x0 = x;    %update p0 
end 
fprintf('Solution did not coverge within %d iterations at a required precision of %d \n', N, error)  %error for non-convergence within N iterations 

Когда я побежал это дает ошибку ниже:

  1. Ошибки использование mupadmex Ошибки в команде MuPAD: DOUBLE не может преобразовать выражение ввода в двойной массив.
  2. Ошибка использования diff Функция 'diff' не поддерживается для класса 'function_handle'. Ошибка в строке 10 diff = diff (f);
    % дифференциал f (х)

Я не знаю, как исправить эти ошибки. Помощь действительно ценится.

+0

Raplace 10 строка на df = diff (f (x)); и будет рассмотрен с последней строкой. –

+0

Спасибо. Он работал для второй ошибки, но первая ошибка все еще остается. – user3563283

+0

Это странно. Какова ваша версия matlab и покажите модифицированную версию кода. Мои показания: Решение 0.043026 –

ответ

0

Перед инициализацией цикла x. В противном случае вы попытаетесь начать спуск без первоначального предположения. Метод Ньютона является локальным методом, поэтому вам нужно выбрать регион, в котором вы подозреваете, что локальный минимум вы хотите сходиться.

Затем избавиться от двойного утверждения. Поскольку ошибка говорит вам, что double (x) - это функция, определенная в muPad, которая не является точно matlab, но эта небольшая подпрограмма. В принципе, вы не можете использовать эту функцию.

Используйте f (x), так как у вас уже есть дескриптор функции. А для df вы можете использовать subs (df, x) каждую итерацию. Это заменит x в df на x, который вы дадите ему в subs, .. сделайте его двойным автоматически путем подстановки.

Рекомендации по применению:

f = @(x) x^2 
syms a 
df = diff(f(a)) = 2*a 
numeric_value1 = f(3) = 9.0 
numeric_value2 = subs(df,3) = 6.0 

Значения являются двойными, withou явного объявления.

Смежные вопросы