|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
! j7 R, E4 w4 _$ A: _7 }- u/ d0 M6 B
# S5 V. U5 i0 [6 J2 I9 K
MATLAB源程序代码分享:MATLAB实现牛顿迭代法求解非线性方程组% b) V3 ?: H5 r) I1 v' E7 P
, ~/ F) |6 Y' F; Y8 X; k- s
" b( S1 M5 E, a/ h; M' R# L6 ~' j, m' D; \
%% 定义一个三元非线性方程组
" B- a% Y, x7 E1 T1 lclear;clc;close all
5 a0 l) Z3 T: d6 P3 \+ w9 O7 Xsyms x y z % 定义符号变量 x y z" n- s# ?$ c! G9 x. f; R) T
f1=6/(1+(x-y).^2)+sin(pi*y/2); % 方程 15 j3 L) A [. n+ [8 q
f2=x*sin(pi*x)+y*sin(20*pi*y)-z; % 方程 2/ S; L1 s: k( W; M9 r
f3=x+2.0*y+z; % 方程 3 q2 ]; `! H$ v; j- w4 A3 j
f=[f1;f2;f3]; % 三个方程组成方程组) p! f0 d( S- w& F2 ?
M( Y( p4 ~2 k( u
%% 计算雅克比矩阵: f) M' q6 T2 \7 O" A
J=[diff(f1,x) diff(f1,y) diff(f1,z) 7 y# V* S; C5 ~3 t
diff(f2,x) diff(f2,y) diff(f2,z)9 g3 K1 ?) q9 M4 ]7 z8 K9 O% I4 X. M% S
diff(f3,x) diff(f3,y) diff(f3,z)];/ j5 Q$ }0 m: g2 K- q' u
5 y" t9 l% j7 Y* Y$ y
%% 自定义牛顿迭代算法, 求方程组的解
( ]( H" E* v0 B6 e: N' H! p& X; P+ tn=1; % 记录迭代的次数
1 K7 }1 T+ T+ j; l0 xx0=[-5;0;7]; % 迭代初值) K7 t4 z$ }. J9 g" q7 g! V
E=1;8 O) Q c* G2 ~. ~
while E > 1e-4 % 如果精度不满足要求, 则一直进行迭代, 直到满足精度为止3 d2 o+ I6 t0 n$ o6 |7 Y
x=x0(1); % 给 x 赋值
4 q& P9 p6 D- F/ R; ~ y=x0(2); % 给 y 赋值4 d# }3 q# O4 [' }. i( Y) z
z=x0(3); % 给 z 赋值
6 A& H+ t& i8 }" c; w0 | x1=x0-inv(eval(J))*eval(f); % 迭代计算, 用 x0 迭代得到 x1
+ m& t4 u3 T, o$ j, x4 [- V E=max(abs((x1-x0)./x1)); % 计算求解的精度
) F( _3 t; C' T: @4 u7 ?' l9 k: i x0=x1; % 将当前得到的解 x1 赋值给 x0, 做为下一次迭代的值4 l; f7 x- C, L
n=n+1; % 迭代次数加 1 1 d3 f% f8 p3 @; h- O
end
6 g! F2 K0 W; G% T; W4 s& t* p0 f- ^. H) A! e
%% 显示方程组的解, 并将求解结果带回方程组, 验算求解结果3 Z ~+ g. i( t2 ^
x=x1(1) % x 的求解结果3 c+ c8 d0 E5 n# `/ i
y=x1(2) % y 的求解结果
4 e+ K) d2 B, H7 [8 kz=x1(3) % z 的求解结果/ t; v( f$ j/ _# a, a E/ M3 F
eval(f) |
|