C语言解多次方程方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言解多次方程方法

一 理论背景 我们先考虑线性方程,线性方程组的解便不难得出了。 与线性方程相比,非线性方程问题无论是从理论上还是从计算公式上,都要复杂得多。对于一般的非线性方程,计算方程的根既无一定章程可寻也无直接法可言。例如,求解高次方程组的根,求解含有指数和正弦函数的超越方程的零点。解非线性方程或方程组也是计算方法中的一个主题。在解方程方面,牛顿(I . Newton)提出了方程求根的一种迭代方法,被后人称为牛顿算法。三百年来,人们一直用牛顿算法,改善牛顿算法,不断推广算法的应用范围。牛顿算法,可以说是数值计算方面的最有影响的计算方法。 对于言程式,如果是线性函数,则它的求根是容易的。牛顿法实质上是一种线性化方法,其基本思想是将非线性方程式逐步归结为某种线性方程来求解。解非线性方程组只是非线性方程的一种延伸和扩展。 二 主要理论 考虑方程组 其中均为多元函数。若用向量记号记, 就可写成 当,且中至少有一个是自变量 的非线性函数时,则称方程组为非线性方程组。非线性方程组求根问题是前面介绍的方程即求根的直接推广,实际上只要把单变量函数看成向量函数则可将单变量方程求根方法推广到方程组。若已给出方程组的一个近似根 将函数的分量在用多元函数泰勒展开,并取其线性部分,则可表示为 令上式右端为零,得到线性方程组 其中 称为为雅可比(Jacobi)矩阵。求解线性方程组,并记解为,则得 这就是解非线性方程组的牛顿法。 三.算法 牛顿法主要思想是用 进行迭代 。因此首先需要算出的雅可比矩阵,再求过求出它的逆,当它达到某个精度时即停止迭代。 具体算法如下: 首先宏定义方程组 ,确定步长和精度; 求的雅可比矩阵; 可用 求出雅可比矩阵; 求雅可比矩阵的逆; 将右乘一个单位矩阵,通过单位矩阵变换实现求 的逆,用指针来存贮。 雅可比矩阵与其逆的相乘; 用来迭代; 当精度大于时,重复执行2——5步,直到精度小于或等于停止迭代,就是最后的迭代结果。 其中 四.代码 #include iostream.h #include stdlib.h #include math.h #include conio.h #define f0(x1,x2) (x1+2*x2-3) #define f1(x1,x2) (2*x1*x1+x2*x2-5) #define x_ 0.000001 #define matrixNum 2 double *matrixF2(double *x); int y=0; void main() { int i,j,n; double p,*x; double *b; double *matrixF; //矩阵F double *matrixF_; //矩阵F的雅可比矩阵的逆 b=(double *)malloc(matrixNum); matrixF=(double *)malloc(matrixNum); matrixF_=(double *)malloc(matrixNum*matrixNum); cout请输入初值:; for(i=0;imatrixNum;i++) cin*(x+i); do { p=0.0; for(i=0;imatrixNum;i++) *(b+i)=0; *matrixF=f0(*x,*(x+1)); *(matrixF+1)=f1(*x,*(x+1)); matrixF_=matrixF2(x); for(i=0;imatrixNum;i++) { for(j=0;jmatrixNum;j++) *(b+i)+=*(matrixF_+i*matrixNum+j)*(*(matrixF+j)); *(x+i)=*(x+i)-*(b+i); cout*(x+i) ; } coutendl; for(i=0;imatrixNum;i++) p+=pow(*(b+i),2); y++; }while(sqrt(p)x_); cout停止迭代,最终迭代结果为*x,*(x+1)endl; delete [] matrixF; delete [] matrixF_;

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档