牛頓迭代法,又名切線法,這里不詳細介紹,簡單說明每一次牛頓迭代的運算:首先將各個方程式在一個根的估計值處線性化(泰勒展開式忽略高階余項),然后求解線性化后的方程組,最后再更新根的估計值。下面以求解最簡單的非線性二元方程組為例(平面二維定位最基本原理),貼出源代碼:
1、新建函數fun.m,定義方程組
1 function f=fun(x); 2 %定義非線性方程組如下 3 %變量x1 x2 4 %函數f1 f2 5 syms x1 x2 6 f1 = sqrt((x1-4)^2 + x2^2)-sqrt(17); 7 f2 = sqrt(x1^2 + (x2-4)^2)-5; 8 f=[f1 f2];
2、新建dfun.m,求出一階微分方程
1 function df=dfun(x); 2 f=fun(x); 3 df=[diff(f,'x1');diff(f,'x2')]; %雅克比矩陣
3、建立newton.m,執行牛頓迭代過程
1 clear;clc 2 format; 3 x0=[0 0]; % 迭代初始值 4 eps = 0.00001; % 定位精度要求 5 for i = 1:10 6 f = double(subs(fun(x0),{'x1' 'x2'},{x0(1) x0(2)})); 7 df = double(subs(dfun(x0),{'x1' 'x2'},{x0(1) x0(2)})); % 得到雅克比矩陣 8 x = x0 - f/df; 9 if(abs(x-x0) < eps) 10 break; 11 end 12 x0 = x; % 更新迭代結果 13 end 14 disp('定位坐標:'); 15 x 16 disp('迭代次數:'); 17 i
結果如下:
定位坐標:
x =
0.0000 -1.0000
迭代次數:
i =
4
