欢迎来到天天文库
浏览记录
ID:43493940
大小:452.10 KB
页数:5页
时间:2019-10-08
《牛顿迭代法解非线性方程组》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、计算方法第十章上机报告00986096沈欢北京大学工学院,北京1008712012年5月13日1问问问题题题描描描述述述编制求解非线性方程组的牛顿法程序。用上述程序求解以下非线性方程组并输出结果。f=x2+x2+x2¡1=0;(1)1123f=2x2+x2¡4x=0;(2)2123f=3x2¡4x+x2=0;(3)3123取初值为(1:0;1:0;1:0)T,设定精度为10¡7.图1:Jacobi矩阵1䕧ܹᮍ㓈᭄nˈঞ߱ྟ䗁ҷ䞣X0Џߑ᭄䗁ҷ˖Ƹ䅵ㅫߚ㾷⊩㾷㒓ᗻᮍ㒘ˈ∖Ƹ䅵ㅫⶽ䰉图2:程序框架2牛牛牛顿顿顿法法法简简简述述述牛顿法的迭
2、代格式为:¡!k+1¡!k¡!k¡1¡!kx=x¡[F(x)]f(x)(4)¡!其中F(x)是Jacobi矩阵,如图一所示。¡!k对F(x)作LU分解,即:¡!kkkF(x)=LU(5)通过解:¡!¡!Lkyk=f(xk)(6)¡!得到yk.通过解:¡!¡!Uk±k=yk(7)¡!得到±k.由¡¡!¡!¡!xk+1=xk¡±k(8)2实现迭代。¡¡!迭代结束的条件为:maxjf(xk+1)j<"其中"为预设精度。i图3:输入界面3程程程序序序描描描述述述用于实现上述算法的程序见附件“nonlinear.cpp".该程序的框架如图二所示。整个
3、函数由主函数"main"和子函数"voidfunction(double*x,double*f)"、"voidJacobi(double*x,double**J)"、"voidLU(intn,double*b,double**A,double*detax)"构成。在主函数中实现以下功能:1、定义计算精度error,以及其他各种计算中的中间变量。2、用友好的输入界面,提示用户输入方程组的维数n(方程的个数)、以及初始的迭代向¡!量x0.输入方法如图三所示。3、为通用变量(在子函数可以对这些变量进行修改)的存储开辟空间。这些变量是:¡!用于存储
4、x的变量:"double*x=newdouble[n+1]".¡¡¡!¡!用于存储f(x)的变量:"double*f=newdouble[n+1]"用于存储Jacobi矩阵的变量:"double**J=newdouble*[n+1]".所有的子函数均直接对这些值进行操作,就不再返还任何值。¡!4、调用子函数"voidfunction(double*x,double*f)"计算f(xk)、调用子函数"voidJacobi(double*x,double**J)"计算Jacobi矩阵、调用子函数"voidLU(intn,double*b,dou
5、ble**A,double3¡!*detax)"计算±k.通过第二部分描述的迭代格式(8)式进行迭代求解。当满足精度要求时结束计算。5、输出满足精度要求的解。¡!子函数"voidfunction(double*x,double*f)"由用户自己编写实现f(x)的计算。函数的被主¡!¡!函数调用,入口参数为存储x的指针和存储f(x)的指针。编写方式如图四所示。图4:子函数function的编写方式示例子函数"voidJacobi(double*x,double**J)"由用户自己编写实现Jacobi矩阵的计算。函数的¡!被主函数调用,入口参数
6、为存储x的指针和存储Jacobi矩阵的指针。编写方式如图五所示。图5:子函数Jacobi的编写方式示例子函数"voidLU(intn,double*b,double**A,double*detax)"用第二部分描述的LU分解法求解线性方程:¡!¡!¡¡¡!¡!F(xk)±k=f(xk)(9)其入参为方程维数n,右端项指针b,系数矩阵的指针A,解的存储指针detax.44计计计算算算结结结果果果¡¡!将f(x)及Jacobi矩阵设置为题意所需。取"=10¡7,初始向量[1;1;1]T。经5次迭代,计算结果为:x=[0:785197;0:496
7、611;0:369923]T.计算结果如图六所示。图6:计算结果5
此文档下载收益归作者所有