牛顿法非线性方程求解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《MATLAB 程序设计实践》课程考核

---第37-38页

题1 : 编程实现以下科学计算算法,并举一例应用之。(参考书籍《精

通MAT LAB科学计算》,王正林等著,电子工业出版社,2009 年)

“牛顿法非线性方程求解” 弦截法本质是一种割线法,它从两端向中间逐渐逼近方程的根;牛顿法本质上是一种切线法,它从一端向一个方向逼近方程的根,其递推公式为:

-

=+n n x x 1)

()('

n n x f x f

初始值可以取)('a f 和)('b f 的较大者,这样可以加快收敛速度。 和牛顿法有关的还有简化牛顿法和牛顿下山法。

在MATLAB 中编程实现的牛顿法的函数为:NewtonRoot 。 功能:用牛顿法求函数在某个区间上的一个零点。 调用格式:root=NewtonRoot )(```eps b a f 其中,f 为函数名; a 为区间左端点; b 为区间右端点 eps 为根的精度; root 为求出的函数零点。 ,

牛顿法的matlab程序代码如下:

function root=NewtonRoot(f,a,b,eps)

%牛顿法求函数f在区间[a,b]上的一个零点%函数名:f

%区间左端点:a

%区间右端点:b

%根的精度:eps

%求出的函数零点:root

if(nargin==3)

eps=1.0e-4;

end

f1=subs(sym(f),findsym(sym(f)),a);

f2=subs(sym(f),findsym(sym(f)),b);

if (f1==0)

root=a;

end

if (f2==0)

root=b;

end

if (f1*f2>0)

disp('两端点函数值乘积大于0 !');

return;

else

tol=1;

fun=diff(sym(f)); %求导数

fa=subs(sym(f),findsym(sym(f)),a);

fb=subs(sym(f),findsym(sym(f)),b);

dfa=subs(sym(fun),findsym(sym(fun)),a);

dfb=subs(sym(fun),findsym(sym(fun)),b);

if(dfa>dfb) %初始值取两端点导数较大者

root=a-fa/dfa;

else

root=b-fb/dfb;

end

while(tol>eps)

r1=root;

fx=subs(sym(f),findsym(sym(f)),r1);

dfx=subs(sym(fun),findsym(sym(fun)),r1); %求该点的导数值 root=r1-fx/dfx; %迭代的核心公式

tol=abs(root-r1);

end

end

例:求方程3x^2-exp(x)=0的一根

解:在MATLAB命令窗口输入:

>> r=NewtonRoot('3*x^2-exp(x)',3,4)

输出结果:

X=3.7331

2、编程解决以下科学计算问题

1) 二自由度可解耦系统的振动模态分析,二自由度振动系统如图所示,其一般方程为:

)12(2)12(2220

221)21(221)21(11.

.

..

.

.

..

=-+-+=-++-++x x K x x c x m x K x K K x c x c c x m

可写成矩阵形式:0.

..

=++Kx x C x M

设C=0,即无阻尼情况,则系统可解耦为两种独立的振动模态。

流程图:

系统解耦的振动模态的MATLAB代码如下:function erziyoudu()

%输入各原始参数

m1=input('m1=');m2=input('m2='); %质量

k1=input('k1=');k2=input('k2='); %刚度

%输入阻尼系数

c1=input('c1=');c2=input('c2=');

%给出初始条件及时间向量

x0=[1;0];

xd0=[0;-1];

tf=50; %步数

dt=0.1; %步长

%构成二阶参数矩阵

M=[m1,0;0,m2];

K=[k1+k2,-k2;-k2,k2];

C=[c1+c2,-c2;-c2,c2];

%构成四阶参数矩阵

A=[zeros(2,2),eye(2);-M\K,-M\C];

%四元变量的初始条件

y0=[x0;xd0];

%设定计算点,作循环计算

for i=1:round(tf/dt)+1

t(i)=dt*(i-1);

y(:,i)=expm(A*t(i))*y0;%循环计算矩阵指数

end

%按两个分图绘制x1、x2曲线

subplot(2,1,1),plot(t,y(1,:)),grid

xlabel('t'),ylabel('y');

subplot(2,1,2),plot(t,y(2,:)),grid

xlabel('t'),ylabel('y');

运行M文件,依下图所示在MATLAB命令窗口中输入数据:

即可得出该振动的两种模态

相关文档
最新文档