c语言解多次方程方法.doc
一理论背景我们先考虑线性方程,线性方程组的解便不难得出了。与线性方程相比,非线性方程问题无论是从理论上还是从计算公式上,都要复杂得多。对于一般的非线性方程()0fx,计算方程的根既无一定章程可寻也无直接法可言。例如,求解高次方程组6371.50 xx的根,求解含有指数和正弦函数的超越方程cos()e的零点。解非线性方程或方程组也是计算方法中的一个主题。在解方程方面,牛顿(I.Newton)提出了方程求根的一种迭代方法,被后人称为牛顿算法。三百年来,人们一直用牛顿算法,改善牛顿算法,不断推广算法的应用范围。牛顿算法,可以说是数值计算方面的最有影响的计算方法。对于言程式()0fx,如果()fx是线性函数,则它的求根是容易的。牛顿法实质上是一种线性化方法,其基本思想是将非线性方程式()fx逐步归结为某种线性方程来求解。解非线性方程组只是非线性方程的一种延伸和扩展。二主要理论考虑方程组11(,.)0,.(,.).nnnfxf1其中1,.均为1,.x多元函数。若用向量记号记1(,.),(,.)TnTnnxRFff,1就可写成(0.x(2当2,n,且1,)if中至少有一个是自变量,.)ixn的非线性函数时,则称方程组(为非线性方程组。非线性方程组求根问题是前面介绍的方程即)n求根的直接推广,实际上只要把单变量函数()fx看成向量函数(Fx则可将单变量方程求根方法推广到方程组(2)。若已给出方程组(2)的一个近似根()1,.),kkkTnxx将函数Fx的分量1,.ifxn在()k用多元函数泰勒展开,并取其线性部分,则可表示为()()()().kkkFx令上式右端为零,得到线性方程组()()(),kkkxF(3)其中1112221212()()()()()()()nnnnnfxffxfffxxFfxfxf(4)称为()F为雅可比(Jacobi)矩阵。求解线性方程组3,并记解为(1)kx,则得()()()1()kkkxF0,1.)(5这就是解非线性方程组2的牛顿法。三.算法牛顿法主要思想是用(1)()()1()kkkkxFx(0,1.)k进行迭代。因此首先需要算出的雅可比矩阵()Fx,再求过(Fx求出它的逆1()Fx,当它达到某个精度(x_k)时即停止迭代。具体算法如下:1.首先宏定义方程组()x,确定步长x和精度();2.求()Fx的雅可比矩阵F;可用111(,.,.)(,._,.)(,.,.)ijnijnijnjfxxfxxfx求出雅可比矩阵;3.求雅可比矩阵()Fx的逆1()x;将()x右乘一个单位矩阵01,通过单位矩阵变换实现求F的逆,用指针来存贮。4.雅可比矩阵()x与其逆1()Fx的相乘;5.用()来迭代;6.当精度i_k大于时,重复执行2——5步,直到精度小于或等于x停止迭代,ix_k就是最后的迭代结果。其中(1)()2(1)()2i_k,.iiiinnx四.代码#include#include#include#include#definef0(x1,x2)(x1+2*x2-3)#definef1(x1,x2)(2*x1*x1+x2*x2-5)#definex_0.000001#definematrixNum2double*matrixF2(double*x);inty=0;voidmain(){inti,j,n;doublep,*x;double*b;double*matrixF;//矩阵Fdouble*matrixF_;//矩阵F的雅可比矩阵的逆b=(double*)malloc(matrixNum);matrixF=(double*)malloc(matrixNum);matrixF_=(double*)malloc(matrixNum*matrixNum);cout>*(x+i);do{p=0.0;for(i=0;ix_);cout<