2017-02-21 2 views
2

Я пробовал нелинейные полиномиальные функции, и этот код работает хорошо. Но для этого я попробовал несколько методов для решения линейного уравнения df0 * X = f0 с использованием обратного слэша или bicg или lsqr, также попробовал несколько начальных значений, но результат никогда не сходится.НЕ КОНВЕРГ: используйте метод Ньютона Рафсона для поиска корня нелинейных уравнений

% Define the given function 
syms x1 x2 x3 

x=[x1,x2,x3]; 

f(x)=[3*x1-cos(x2*x3)-1/2;x1^2+81*(x2+0.1)^2-sin(x3)+1.06;... 
    exp(-x1*x2)+20*x3+1/3*(10*pi-3)]; 

% Define the stopping criteria based on Nither or relative errors 

tol=10^-5; 
Niter=100; 

df=jacobian(f,x); 

x0=[0.1;0.1;-0.1]; 

% Setting starting values 

error=1; 
i=0; 

% Start the Newton-Raphson Iteration 

while(abs(error)>tol) 

f0=eval(f(x0(1),x0(2),x0(3))); 

df0=eval(df(x0(1),x0(2),x0(3))); 

xnew=x0-df0\f0; % also tried lsqr(df0,f0),bicg(df0,f0) 

error=norm(xnew-x0); 

x0=xnew; 

i=i+1 

if i>=Niter 

    fprintf('Iteration times spill over Niter\n'); 

    return; 

end 

end 
+0

Запланируйте функцию и посмотрите, как лучше выбрать начальное предположение. – duffymo

+0

функция представляет собой вектор, состоящий из трех уравнений, как построить? – Jarvis

+0

Почему вы используете 'eval' там?!? Это совершенно необязательно и уничтожит скорость вычислений, а также привлечет вас в ужасную яму, которая является «eval» и ее вредоносными привычками. – Adriaan

ответ

1

Здесь вам понадобятся анонимные функции, чтобы лучше выполнять работу (мы уже говорили об этом сегодня!).

Во-первых, давайте определим определение функции. Анонимные функции - это отличные способы для вызова вещей способом, подобным математическим функциям. Например,

f = @(x) x^2;

является функцией возведения в квадрат. Чтобы оценить его, просто напишите, как на бумаге f(2). Поскольку у вас есть многомерная функция, вам необходимо векторизация следующего определения:

f(x) = @(x) [3*x(1) - cos(x(2) * x(3)) - 1/2; ...

Для вашего якобиану, вам нужно использовать другую анонимную функцию (возможно назвать это grad_f) и вычислить его бумагу, затем введите код. Функция jacobian использует конечные различия, и поэтому ошибки могут накапливаться, а якобиан нестабилен в некоторых регионах.

Ключ должен быть осторожным и использовать некоторые хорошие методы кодирования. См. this document для получения дополнительной информации об анонимных функциях и других хороших практиках MATLAB.

+0

Большое вам спасибо! – Jarvis

+0

У меня все еще есть вопрос, градиент f (x), который я вычислил, совпадает с результатом функции jacobian. Кроме того, я использовал только jacobian в первом начале, не в цикле, это будет считаться? – Jarvis

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