|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
/ J% ?3 ^" x! ^: Z/ y4 F9 y
% f2 t+ P) p- U9 ~) |# C$ d
MATLAB源程序代码分享:MATLAB实现牛顿迭代法求解非线性方程组) t6 w+ @; L9 E' j* z6 `
9 b, e, i+ a$ w$ K. f6 b/ \
7 e! b3 U' ]5 T* {
) D; |- g* D4 t7 }" J0 k: C( _%% 定义一个三元非线性方程组
, W4 k$ E! M0 V$ P2 Q* [clear;clc;close all. x/ p8 _ }6 _( F( r$ N
syms x y z % 定义符号变量 x y z4 K* S; s. Z% D5 I) R8 U
f1=6/(1+(x-y).^2)+sin(pi*y/2); % 方程 1- Z, X5 @7 }) e5 Y3 @2 S: P# b1 o
f2=x*sin(pi*x)+y*sin(20*pi*y)-z; % 方程 2 h2 a! L- `, A- C/ H
f3=x+2.0*y+z; % 方程 3# s8 T% q% { r7 @8 k
f=[f1;f2;f3]; % 三个方程组成方程组
# r0 s9 d( C( ^' G" c
. E' j I2 F! W/ X1 j%% 计算雅克比矩阵
; k/ a% p T; }( ^* r7 g6 GJ=[diff(f1,x) diff(f1,y) diff(f1,z) % |0 J9 I) K% i
diff(f2,x) diff(f2,y) diff(f2,z)
# k9 B0 E) u# L5 T( i: L diff(f3,x) diff(f3,y) diff(f3,z)];% q% e) F& U( t. i2 h; Q
2 q+ ^4 W4 D- |0 C! i& |! w%% 自定义牛顿迭代算法, 求方程组的解
( V" f( _9 s, q) @n=1; % 记录迭代的次数
; R, y3 w9 v8 p% i7 J( Ox0=[-5;0;7]; % 迭代初值: S3 O# y ^9 I
E=1;
7 d( t/ F; p0 J, s5 X$ ~# S3 U+ Ywhile E > 1e-4 % 如果精度不满足要求, 则一直进行迭代, 直到满足精度为止
, ~, ?1 J; ]( ?1 T/ |4 K- C6 U x=x0(1); % 给 x 赋值
$ r8 w" r) Q, l# r$ q y=x0(2); % 给 y 赋值" B+ m; A- G6 E4 c1 I
z=x0(3); % 给 z 赋值3 [( X/ L( w6 s& } }8 ]! z
x1=x0-inv(eval(J))*eval(f); % 迭代计算, 用 x0 迭代得到 x16 W( O: u+ i. V3 F( `: p
E=max(abs((x1-x0)./x1)); % 计算求解的精度: F& g* H/ u6 V3 b5 _# I
x0=x1; % 将当前得到的解 x1 赋值给 x0, 做为下一次迭代的值' }# h, |; F0 |, O0 F, I
n=n+1; % 迭代次数加 1 7 h, ]) [$ f! u( r3 M9 p+ s z. Z% q
end8 W4 H% i( x' X; c" B# n
8 }8 P0 V% A6 Y. Y" `) z
%% 显示方程组的解, 并将求解结果带回方程组, 验算求解结果
$ h4 d* o) Q- }6 w5 Wx=x1(1) % x 的求解结果
0 a O. L6 @$ ?: F. Dy=x1(2) % y 的求解结果6 e* b% {& P `5 ?- d) b7 O
z=x1(3) % z 的求解结果
$ K* B7 d: H" y& O Peval(f) |
|