非线性方程组研究毕业论文第一章绪论1.1 了解非线性方程组的一般形式如下:f l X i ,X 2,X 3,...,X n =0, ,f n (X i ,X 2,X 3,…,X n )=0,可以看出f i i = 1,2,3,..., n 是在空间R 的实值函数。
再用向量转换下可以得到:把F 可以看做在R n 区域内展开的非线性映像,表示为F 尸 D R n、 R n1.2下面来介绍简单的边值问题:X = f t,s 0 乞t 辽1 , x 0 二 a, x 1 = :。
( 1.2)此时定义f 在D —t,x |0岂21,-:: ::x ::::[上二阶可微连续, 现在求解(1.2)上X 的数值。
(1.1)F X = 0。
我们用差分方法离散化得到:u 1 4 •…h= -------- , t j = J h, j=0,1,2,3 ,、、n+1 ,n +1在得到:'' 1X (t j )=活区斗—2X j +X j J j+1,2,八、n, h在转化矩阵又可以得到:2-10-1 2 ...A =0 ... -1-…-1 2_在从映像转换成:2x =h X j,...X n ,方程(1.2)转化为:Ax+ 「x =0本文将介绍求解非线性方程组的牛顿法,迭代法,牛顿法,这是本人对非线性方程数值求解的认识,我会使用这些方法并为为开展进一步研究。
第二章、求解非线性方程组的牛顿法2.1牛顿法的引入与介绍在学习中关于方程f x =0的求解这种题型接触的太多了, f x 作为线性方程 函数,解法多样也很容易求解值。
我们来比较一下牛顿法,牛顿法简单的来说其实也 是一种线性化方法,他的理念就是把非线性方程 f x 转化成某种类型的线性方程求解x 的值。
非线性方程不过是线性方程的扩展, 非线性方程组就是在此基础上加以延 伸。
F 面我们来介绍了解一下牛顿法的理论:我们看下例题:f l X i ,X 2,X 3,…,X n i=0.也可以用向量把它转化为F x [=0 可以看出n^2时,fj(i=1,...,n )至少有一个变量是在x(i=1,...,n )的非线性函数, 我们这时(2.1)就可以看作非线性方程组,非线性方程组的求解实际上就是n=1求根的应用。
也就是把单一变量的函数f x 转化为向量函数F x ,这个时候就可以用 求解单变量的方法来求解非线性方程组(2.2)。
若果知道方程组F (x )=0的一个近似根x$)=(辽...,X :),再用函数F(x )的分量fi (x )(i =1,...., n )在x (k 用多元函数泰勒的 方法展开,提取线性方程就可以得到:F (X )跆 F (x * ))十 F'(X (k )K x _X (k )),f n X i ,X 2,X 3,...,X n = 0,从上面非线性方程组我们可以看出 f 1,(2.1)f n 是N ,…x n 的多元函数,这是我们(2.2)我们同时把他转化为:得到:F x %—F ' x k x —x k其中:这时可以把(2.4)作为雅克比矩阵,(2.3)的线性方程组的解我们记作为 x k1 , 就可以得到:x x D=x (k )-F'(x (k ))」F (x (k )) (k=0,1,2,..…)。
(2.5)这就是我们所说的求解非线性方程组(2.5)的牛顿法。
从上面的实例我们可以看得出牛顿法求解非线性方程的主要理论是用x D=x f )-F'(x (k )) F (x (k ))在(k=0,1,2,...)的基础上进行迭代计算。
我们这时所要做的就是计算出F (x )的雅克比矩阵F ' x ,通过F ' x 得到它的逆F ' x J ,直到 达到所需要的精度(x_k )的范围内才停止迭代2.2牛顿法的算法牛顿法算法如下:第一步:首先我们把所要求解的非线性方程组定义为F (x ),并为之确定精度(x_k )<第二步:把F x 转化为雅克比矩阵,得到F ' x 。
求解方法如下:少 f j ( X i ,..., X j ,..., X n ) f i ( x i X j * X _,..., X n ) — f ^ x i ,..., x j ,..., X n )®X j x_第三步:重复第二步方法,求解F ' x 雅克比矩阵的逆F ' x '。
另外把F ' x 乘以单位F x 二令F X j=O ,(2.3)(2.4)白…o '矩阵“ '',我们可以用单位矩阵转换求解F '(X )的逆用来保存。
\0 (1)J第四步:F ' X 与F ' X 的相乘第五步:再用 X X D=X (k )_F (X (k )) F (X (k )) ( k=0,1,2,..…)来迭代。
精度达到最小(精度 < X k )时停止迭代,最后的迭代结果为X k i 。
i=J (x i (卑)_旳(»,…,(x f 率)一xf ))2.3牛顿法代码程序编程最后介绍代码的编程:#i nclude <iostream.h> #include <stdlib.h> #in clude <math.h> #in clude vconi o.h>#define f0(x1,x2) (x1+2*x2-3)#define f1(x1,x2) (2*X 1*X 1+X 2*X 2-5) #defi ne X _ 0.000001 #define matrixNum 2double *matrixF2(double *X ); int y=0; void mai n() {int i,j,n;double p,*x; double *b;double *matrixF; //矩阵 Fdouble *matrixF_;〃矩阵F 的雅可比矩阵的逆b=(double *)malloc(matrixNum);matrixF=(double *)malloc(matrixNum); matrixF_=(double *)malloc(matrixNum*matrixNum); coutvv"请输入初值:"; for(i=0;i<matrixNum;i++)cin> >*(x+i); do {p=0.0;for(i=0;i<matrixNum;i++)第六步:最后我们注意的时精度,其精度x_K >x_k 时,我们需要重复 2—5次,直使x_k i*(b+i)=0;*matrixF=f0(*x,*(x+1));*(matrixF+1)=f1(*x,*(x+1));matrixF_=matrixF2(x);for(i=0;i<matrixNum;i++){for(j=0;j<matrixNum;j++) *(b+i)+=*(matrixF_+i*matrixNum+j)*(*(matrixF+j));*(x+i)=*(x+i)-*(b+i);cout<<*(x+i)<<" ";}cout<<endl;for(i=0;i<matrixNum;i++) p+=pow(*(b+i),2);y++;}while(sqrt(p)>x_);cout«"停止迭代,最终迭代结果为"vv*x<v','vv*(x+1)vv""vvendl; delete []matrixF; delete [] matrixF_;getch();}double *matrixF2(double *x){int i,j;double t;double *matrixF1; //矩阵F 的雅可比矩阵double *matrixF2; //矩阵F 的雅可比矩阵的逆matrixF1=(double *)malloc(matrixNum*matrixNum);matrixF2=(double *)malloc(matrixNum*matrixNum); for(i=0;i<matrixNum;i++) for(j=0;j<matrixNum;j++)if(i==j) *(matrixF2+i*matrixNum+j)=1;else *(matrixF2+i*matrixNum+j)=0;*matrixF1=(f0((*x+x_),*(x+1))-f0(*x,*(x+1)))/x_;*(matrixF1+1)=(f0(*x,(*(x+1)+x_))-f0(*x,*(x+1)))/x_;*(matrixF1+2)=(f1((*x+x_),*(x+1))-f1(*x,*(x+1)))/x_;*(matrixF1+3)=(f1(*x,(*(x+1)+x_))-f1(*x,*(x+1)))/x_;//for(i=0;i<matrixNum;i++)// cout<<*(x+i)<<endl; cout«"矩阵F 在["vv*x<v','vv*(x+1)vv"]的雅可比矩阵"<<endl; for(i=0;i<matrixNum;i++){for(j=0;j<matrixNum;j++)cout<<*(matrixF1+i*matrixNum+j)<<" ";cout<<endl;}//求矩阵F 的雅可比矩阵的逆t=*matrixF1;for(i=0,j=0;j<matrixNum;j++){*(matrixF1+i*matrixNum+j)/=t;*(matrixF2+i*matrixNum+j)/=t;}t=*(matrixF1+1*matrixNum);for(i=1,j=0;j<matrixNum;j++){*(matrixF1+i*matrixNum+j)-=*(matrixF1+j)*t;*(matrixF2+i*matrixNum+j)-=*(matrixF2+j)*t;}t=*(matrixF1+1*matrixNum+1);for(i=1,j=0;j<matrixNum;j++){*(matrixF1+i*matrixNum+j)/=t;*(matrixF2+i*matrixNum+j)/=t;}t=*(matrixF1+1);for(i=i,j=0;j<matrixNum;j++){*(matrixF1+j)-=*(matrixF1+i*matrixNum+j)*t;*(matrixF2+j)-=*(matrixF2+i*matrixNum+j)*t;}for(i=0;i<matrixNum;i++){for(j=0;j<matrixNum;j++)cout<<*(matrixF1+i*matrixNum+j)<<" ";cout<<endl;}for(i=0;i<matrixNum;i++){for(j=0;j<matrixNum;j++)cout<<*(matrixF2+i*matrixNum+j)<<" ";cout<<endl;}cout«"第"vvyvv"次迭代结果为"vv*x<v','vv*(x+1)vv""vvendl;getch();return matrixF2;delete [] matrixF1;delete [] matrixF2;}最后总结:我们可以从上面的实例可以得到,牛顿法是求解非线性方程组最简单的一种线性方法,它的构想是通过非线性方程组以线性方程组转化,从而来形成一种迭代形式然后迭代达到迭代次数来逼近,最终来求解。