C語言解決多元多次方程_第1頁
C語言解決多元多次方程_第2頁
C語言解決多元多次方程_第3頁
C語言解決多元多次方程_第4頁
C語言解決多元多次方程_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、一 理論背景我們先考慮線性方程,線性方程組的解便不難得出了。與線性方程相比,非線性方程問題無論是從理論上還是從計算公式上,都要復(fù)雜得多。對于一般的非線性方程,計算方程的根既無一定章程可尋也無直接法可言。例如,求解高次方程組的根,求解含有指數(shù)和正弦函數(shù)的超越方程的零點。解非線性方程或方程組也是計算方法中的一個主題。在解方程方面,牛頓(I . Newton)提出了方程求根的一種迭代方法,被后人稱為牛頓算法。三百年來,人們一直用牛頓算法,改善牛頓算法,不斷推廣算法的應(yīng)用范圍。牛頓算法,可以說是數(shù)值計算方面的最有影響的計算方法。對于言程式,如果是線性函數(shù),則它的求根是容易的。牛頓法實質(zhì)上是一種線性化方

2、法,其基本思想是將非線性方程式逐步歸結(jié)為某種線性方程來求解。解非線性方程組只是非線性方程的一種延伸和擴展。二 主要理論考慮方程組 其中均為多元函數(shù)。若用向量記號記, 就可寫成 當(dāng),且中至少有一個是自變量 的非線性函數(shù)時,則稱方程組為非線性方程組。非線性方程組求根問題是前面介紹的方程即求根的直接推廣,實際上只要把單變量函數(shù)看成向量函數(shù)則可將單變量方程求根方法推廣到方程組。若已給出方程組的一個近似根 將函數(shù)的分量在用多元函數(shù)泰勒展開,并取其線性部分,則可表示為 令上式右端為零,得到線性方程組 其中 稱為為雅可比(Jacobi)矩陣。求解線性方程組,并記解為,則得 這就是解非線性方程組的牛頓法。三算

3、法 牛頓法主要思想是用 進行迭代 。因此首先需要算出的雅可比矩陣,再求過求出它的逆,當(dāng)它達到某個精度時即停止迭代。 具體算法如下:1 首先宏定義方程組 ,確定步長和精度;2 求的雅可比矩陣;可用求出雅可比矩陣;3 求雅可比矩陣的逆;將右乘一個單位矩陣,通過單位矩陣變換實現(xiàn)求 的逆,用指針來存貯。4 雅可比矩陣與其逆的相乘;5 用來迭代;6 當(dāng)精度大于時,重復(fù)執(zhí)行25步,直到精度小于或等于停止迭代,就是最后的迭代結(jié)果。其中四代碼#include #include #include #include #define f0(x1,x2) (x1+2*x2-3)#define f1(x1,x2) (2

4、*x1*x1+x2*x2-5)#define x_ 0.000001#define matrixNum 2double *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

5、); cout請輸入初值:;for(i=0;i*(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;ix_);cout最終迭

6、代結(jié)果為*x,*(x+1)endl; 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;imatrixNum;i+) for(j=0;jmatri

7、xNum;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;imatrixNum;i+) / co

8、ut*(x+i)endl; cout矩陣F在*x,*(x+1)的雅可比矩陣endl;for(i=0;imatrixNum;i+) for(j=0;jmatrixNum;j+) cout*(matrixF1+i*matrixNum+j) ; coutendl;/求矩陣F的雅可比矩陣的逆 t=*matrixF1; for(i=0,j=0;jmatrixNum;j+) *(matrixF1+i*matrixNum+j)/=t; *(matrixF2+i*matrixNum+j)/=t; t=*(matrixF1+1*matrixNum);for(i=1,j=0;jmatrixNum;j+)*(mat

9、rixF1+i*matrixNum+j)-=*(matrixF1+j)*t; *(matrixF2+i*matrixNum+j)-=*(matrixF2+j)*t;t=*(matrixF1+1*matrixNum+1); for(i=1,j=0;jmatrixNum;j+) *(matrixF1+i*matrixNum+j)/=t; *(matrixF2+i*matrixNum+j)/=t; t=*(matrixF1+1);for(i=i,j=0;jmatrixNum;j+) *(matrixF1+j)-=*(matrixF1+i*matrixNum+j)*t; *(matrixF2+j)-=

10、*(matrixF2+i*matrixNum+j)*t; for(i=0;imatrixNum;i+) for(j=0;jmatrixNum;j+) cout*(matrixF1+i*matrixNum+j) ; coutendl; for(i=0;imatrixNum;i+) for(j=0;jmatrixNum;j+) cout*(matrixF2+i*matrixNum+j) ; coutendl;cout第y次迭代結(jié)果為*x,*(x+1)endl;getch(); return matrixF2; delete matrixF1; delete matrixF2;五算法分析及改進措施

11、牛頓法解非線性方程組是一種線性方法,即將非線性方程組以一線性方程組來近似,由此構(gòu)造一種迭代格式,用以逐次逼近所求的解案。 可以證明Newton迭代至少是二階收斂的,而且收斂速度快。因此牛頓法是解非線性方程的常且方法。 正因為Newton法思想直觀自然,是最常用的,也是研究其它方法的出發(fā)點,該方法的不足恰好是其它方法研究的出發(fā)點。 首先,Newton法的每步迭代都要計算,它是由個偏導(dǎo)數(shù)值構(gòu)造的矩陣,有些問題中每個值可能都很復(fù)雜,甚至根本無法解析地計算。當(dāng)比較大時這部分是算法中耗費時機最多的,不僅如此,每步迭代還要解線性方程組,當(dāng)很大時(如由離散非線性偏微方程導(dǎo)出的非線性方程組,可能有甚至更多),

12、其工作量很大。 其次,在許多情況下,初值要有較嚴格的限制,在實際應(yīng)用中給出確保收斂的初值是十分困難的。非線性問題通常又是多解的,給出收斂到所需要解的初值更加困難。 再有,迭代過程中如果某一步處有奇異或幾乎奇異(后者指的條件數(shù)很大),則Newton法的計算將無法進行下去。特別如果在的解處有奇異,不僅計算困難,而且問題本身也變得十分復(fù)雜,以一無元代數(shù)方程為例,這時方程產(chǎn)生重根。 為了克服Newton法的上述缺點,我們可以采用Newton法和參數(shù)Newton法克服前兩種缺點,擬Newton法可以克服第三種缺點。 這里就擬Newton法為例敘述對牛頓法的改進我們用矩陣近似的代替,從而得到如下形式的迭代

13、法: 0,1,2,.其中Bk均為非奇異的.為了不要每次迭代都計算逆矩陣,我們設(shè)法構(gòu)造直接逼近的逆矩陣,迭代公式化為 : 0,1,2,. 六根據(jù)實例分析結(jié)果對于如下非線性方程組用如上源程序運行。1輸入初值為1.5 1.0 進行迭代的結(jié)果分別為: 理論值分別為: 第一次 1.5 0.75 1.5 0.75 第二次 1.4881 0.755952 1.488095 0.755952 第三次 1.48803 0.755983 1.488034 0.755983 停止迭代,最終迭代結(jié)果為1.488034 0.7559832. 輸入初值為2.0 2.0 進行迭代的結(jié)果分別為: 第一次 1.83333 0.583333 第二次 1.52778 0.736111 第三次 1.4887 0.755652 第四次 1.48803 0.755983以上表明1)迭代中存在誤差;這是由于求雅可比式時用差商法來近似替代了,要過一系列的運算,從而誤差在所難免。由于精度x_取0.000001,已經(jīng)足夠小了,所以迭

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論