《力学中的数学方法》第一节课布置的作业,用牛顿迭代法求解多变量非线性方程组,我用手算的方法算了很长时间,浪费了好多时间,后来一想可以用matlab几分钟就可以算完,所以我特别想记录一下。。。。。。。
%%定义一个三元非线性方程组 clear;clc;close all syms x y z ? ? ? ? ? ? ? ? % 定义符号变量x y z f1=x*y-cos(x)+z*z-3.6; %方程1 f2=x*x-2*y*y+z-2.8; %方程2 f3=3*x+y*sin(z)-2.8; %方程3 f=[f1;f2;f3]; %三个方程组成方程组 %%计算雅可比行列式 J=[diff(f1,x) diff(f1,y) diff(f1,z);diff(f2,x) diff(f2,y) diff(f2,z);diff(f3,x) diff(f3,y) diff(f3,z);]; %%自定义牛顿迭代法,求方程组的解 n=1; ? ? ? ? ? ? ? ? ? ? ?%记录迭代次数 x0=[0;1;1]; ? ? ? ? ? ? ? %迭代初始值 E=1; while E>1e-3 ? ? ? ? ? ? ?%如果精度不满足要求,则一直进行迭代,直到满足要求为止 ? ? x=x0(1); ? ? ? ? ? ? ?%给x赋初始值 ? ? y=x0(2); ? ? ? ? ? ? ?%给y赋初始值 ? ? z=x0(3); ? ? ? ? ? ? ?%给z赋初始值 ? ? x1=x0-inv(eval(J))*eval(f); ?%迭代计算,用x0迭代得到x1 ? ? E=max(abs((x1-x0)./x1)); ? ? ?%计算求解精度 ? ? x0=x1; ? ? ? ? ? ? ? ? ?%将当前得到的x1赋值给x0,作为下一次迭代的初始值 ? ? n=n+1; ? ? ? ? ? ? ? ? ?%迭代次数加1 end %%显示方程组的解,并将求解结果代回方程组,验算求解结果 x=x1(1) %x的求解结果 y=x1(2) %y的求解结果 z=x1(3) %z的求解结果 eval(f)
|