版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計 報 告</p><p> 課程名稱 數(shù)值分析 </p><p> 課題名稱 線性方程組求解 </p><p> 專 業(yè) 信息與計算科學 </p><p> 班 級
2、 </p><p> 學 號 </p><p> 姓 名 </p><p> 指導教師 </p><p> 2012 年 12 月 13 日</p&g
3、t;<p> 一、設計內(nèi)容與設計要求</p><p><b> 1.設計內(nèi)容:</b></p><p> 對課程《計算方法》中的常見算法進行綜合設計或應用(具體課題題目見后面的供選題目)。</p><p><b> 2.設計要求:</b></p><p> 課程設計報告正文內(nèi)
4、容</p><p> a.問題的描述及算法設計;</p><p> b.算法的流程圖(要求畫出模塊圖);</p><p> c.算法的理論依據(jù)及其推導;</p><p> d.相關的數(shù)值結(jié)果(通過程序調(diào)試),;</p><p> e.數(shù)值計算結(jié)果的分析;</p><p> f.附件(
5、所有程序的原代碼,要求對程序?qū)懗霰匾淖⑨專?lt;/p><p><b> 書寫格式</b></p><p> a.要求用A4紙打印成冊</p><p> b.正文格式:一級標題用3號黑體,二級標題用四號宋體加粗,正文用小四號宋體;行距為22。</p><p> c.正文的內(nèi)容:正文總字數(shù)要求在3000字左右(不含
6、程序原代碼)。</p><p> d.封面格式如下頁。</p><p><b> 考核方式</b></p><p> 指導老師負責驗收程序的運行結(jié)果,并結(jié)合學生的工作態(tài)度、實際動手能力、創(chuàng)新精神和設計報告等進行綜合考評,并按優(yōu)秀、良好、中等、及格和不及格五個等級給出每位同學的課程設計成績。具體考核標準包含以下幾個部分:</p>
7、<p> a.平時出勤 (占10%)</p><p> b.系統(tǒng)需求分析、功能設計、數(shù)據(jù)結(jié)構(gòu)設計及程序總體結(jié)構(gòu)合理與否(占10%)</p><p> c.程序能否完整、準確地運行,個人能否獨立、熟練地調(diào)試程序(占40%)</p><p> d.設計報告(占30%)</p><p> 注意:不得抄襲他人的報告(或給他人抄
8、襲),一旦發(fā)現(xiàn),成績?yōu)榱惴帧?lt;/p><p> e.獨立完成情況(占10%)。</p><p><b> 課程驗收要求</b></p><p> a.判定算法設計的合理性,運行相關程序,獲得正確的數(shù)值結(jié)果。</p><p><b> b.回答有關問題。</b></p><
9、p> c.提交課程設計報告。</p><p> d.提交軟盤(源程序、設計報告文檔)。</p><p> e.依內(nèi)容的創(chuàng)新程度,完善程序情況及對程序講解情況打分。</p><p><b> 三、進度安排</b></p><p> 班級: 信息與計算科學:1001、1002、1003</p>
10、<p><b> 主講教師: </b></p><p><b> 輔導教師: </b></p><p><b> 上機時間安排:</b></p><p> 第 12 周 星期一 8時:30分——11時:30分</p><p> 星期三 8時:30分—
11、—11時:30分</p><p> 星期五 8時:30分——11時:30分</p><p> 第 13 周 星期三 8時:30分——11時:30分</p><p> 星期五 8時:30分——11時:30分</p><p><b> 目 錄</b></p><p> 封面……………
12、……………………………………………………(01)</p><p> 任務書………………………………………………………………(02)</p><p> 目錄…………………………………………………………………(05)</p><p> 問題的描述及算法設計……………………………………………(06)</p><p> 算法流程圖………………
13、…………………………………………(07)</p><p> 算法的理論依據(jù)及其推導…………………………………………(08)</p><p> 相關的數(shù)值結(jié)果……………………………………………………(12)</p><p> 數(shù)值計算結(jié)果的分析………………………………………………(15)</p><p> 附件…………………………………
14、………………………………(15)</p><p> 課程設計評分表……………………………………………………(31)</p><p> 一、問題的描述及算法設計</p><p><b> 1、問題描述:</b></p><p> 設有線性方程組,其中,為非奇異矩陣,方程組的增廣矩陣為</p><
15、p> 在科技計算中,求解線性方程組的問題是經(jīng)常遇到的,雖然線性代數(shù)課程中已涉及不少求解線性方程組的方法,但那是理論上的分析求解方法,不能簡單套用到數(shù)值計算中。</p><p> 線性方程組的數(shù)值解法在計算方法課程中占有重要的地位。它大致分為迭代法和直接法兩大類。</p><p><b> 2、算法設計</b></p><p><
16、;b> 2.1直接法:</b></p><p> 在不考慮舍入誤差的情況下,經(jīng)有限步四則運算求得精確解,當n<100及某些大型稀疏方程組、帶型方程組常選用直接解法。</p><p> 最基本的直接解法是Gauss消去法,其他重要的直接解法全都受到Gauss消去法的啟示,此外還有LU分解法。</p><p><b> 2.2迭
17、代法:</b></p><p> 基于一定迭代格式,產(chǎn)生逼近方程組精確解的近似序列,當n>100,特別是某些偏微分方程數(shù)值求解過程中出現(xiàn)的方程組常選用迭代解法。</p><p> 相關理論包括:迭代的收斂性、收斂速度問題、誤差估計,常用的迭代法是:Jacobi迭代法、Gauss-Seidel迭代法、SOR方法。</p><p><b>
18、; 二、算法流程圖:</b></p><p> 三、算法的理論依據(jù)及其推導</p><p><b> 高斯消去元法:</b></p><p> 首先在的第1列選取絕對值最大的元素作為主元素,即選擇</p><p> 然后交換的第1行與第行(交換后增廣矩陣為簡單起見仍記為,其元素仍記為)。經(jīng)過第1次消
19、元得到與原方程組等價的方程 ,</p><p><b> 其中,</b></p><p><b> 上述過程可記為 </b></p><p> 重復上述計算過程,現(xiàn)假設已完成第步的選主元素過程,交換兩行并進行消元計算,此時約化為</p><p> 其中的元素仍記為,的元素仍記為.第步選主元
20、素(在右下角方陣的第1列內(nèi)選),即確定,使</p><p> 交換第行與行的元素,再進行消元計算,最后將原線性方程組化為</p><p><b> 回代可求解得</b></p><p><b> LU分解</b></p><p> 若線性方程組系數(shù)矩陣A的各階順序主子式都不為零,則一定存在唯
21、一的矩陣分解關系</p><p> 其中,L和U分別為下三角矩陣和上三角矩陣,他們的形式為</p><p> 這種特殊的分解形式稱為矩陣的Doolittle分解。</p><p> 若線性方程組的,則線性方程組可變形為</p><p> 令,則,可分裂為兩個等價的方程組</p><p> 由于L和U都是三角矩
22、陣,這兩個方程組都可以通過簡單的回代過程求解??梢姡禂?shù)矩陣分解為求線性方程組帶來可行性和方便。</p><p><b> Jacobi迭代:</b></p><p> 根據(jù)方程組中第i個方程,將未知量Xi用其余的未知量表示出來。</p><p><b> 構(gòu)造迭代格式:</b></p><p&g
23、t; 將上面的格式寫成矩陣乘法的形式,等價與下面的矩陣方程</p><p> 其中,L,D,U分別是原方程組Ax=b中系數(shù)矩陣A的對角線下方元素、對角線元素、對角線上方元素構(gòu)成的矩陣,即</p><p><b> A=L+D+U</b></p><p> 可見,Jacobi迭代法中的迭代矩陣為</p><p>
24、 Gauss-Seidel迭代法</p><p> 在Jacobi迭代法中,注意到計算 時,從一直到都已經(jīng)計算好,然而Jacobi迭代法并沒有利用這些最新的近似值進行下一步的計算,仍用第k步的各個x進行迭代。為此,我們對Jacobi迭代格式進行如下修改:</p><p> 一旦有未知量最新的近似值,下面就用最新結(jié)果進行迭代,這樣可能使收斂速度加快,同時節(jié)省存儲空間</p>
25、<p> 將上面的方程組寫成矩陣乘法形式:</p><p> Gauss-Seidel迭代法的迭代矩陣為:</p><p> Jacobi迭代收斂時,Seidel迭代未必收斂;反之后者收斂時,前者也未必收斂;一般來說,當二者都收斂時,Seidel迭代收斂速度要快一些。</p><p> 逐次超松弛迭代法(SOR)法</p><
26、p><b> 由G-S迭代格式 </b></p><p> 可見,G-S迭代法再計算第k+1步的近似值時,實質(zhì)上是在第k步近似值的基礎上,加上一個修正量。</p><p> 為了獲得更快的收斂效果,在修正量前乘一個松弛因子 W</p><p> 適當選取松弛因子,可望得到收斂速度更快的迭代格式,種方法就稱為逐次松弛迭代法,簡稱SO
27、R (successive over relaxation)法。</p><p> 該方法收斂的必要條件是 : o<w<2,w=1時,就是G-S迭代法;當w>1時,稱為逐次超松弛法;當w<1時,稱為逐次低松弛法。</p><p><b> 四、相關的數(shù)值結(jié)果</b></p><p><b> 1.輸入方程
28、維數(shù)</b></p><p> 2.輸入矩陣并點擊“增廣矩陣輸入好了”</p><p> 3.點擊不同的方法按鈕進行解答</p><p><b> 高斯消去</b></p><p><b> LU分解</b></p><p><b> Jaco
29、bi迭代</b></p><p> Gauss-Seidel迭代</p><p><b> SOR迭代</b></p><p><b> 4.保存文件</b></p><p> 五、數(shù)值計算結(jié)果的分析</p><p> 當輸入的線性方程組是收斂的,可以運
30、用高斯消主元法,當輸入的方程組是收斂的,既可以用高斯消主元法也可以用三種迭代方法計算。</p><p> 當方程組不收斂時,高斯消主元法是求解線性方程組最常用的方法,只要矩陣A的行列式大于零,就可以解得相應的X。</p><p> 當方程組收斂時,將三種迭代法的解和高斯消主元的解進行比較會發(fā)現(xiàn),當?shù)螖?shù)K越大,其方程組的解的值越接近高斯消主元的解,且當?shù)螖?shù)越大第K次的X[i]與第
31、(K-1)次的X[i]的絕對值越接近與零。</p><p> 六、附件(所有程序的原代碼,要求對程序?qū)懗霰匾淖⑨專?lt;/p><p> public class LinearEquations implements ActionListener {</p><p> Jframe jf = new Jframe();</p><p>&
32、lt;b> int n;</b></p><p> double[][] d;</p><p> String str;</p><p> public static void main(String[] args) {</p><p> // 刪除以前保存的文件</p><p> new
33、 File("c:\\保存.doc").delete();</p><p> LinearEquations itt = new LinearEquations();</p><p> itt.lauchFrame();</p><p><b> }</b></p><p> private
34、void lauchFrame() {</p><p><b> // 加載界面</b></p><p> jf.lauchMainFrame();</p><p> // 為p1、p3的按鈕加監(jiān)聽</p><p> jf.b1_1.addActionListener(this);</p><
35、p> jf.b1_2.addActionListener(this);</p><p> jf.b3_1.addActionListener(this);</p><p> jf.b3_2.addActionListener(this);</p><p> jf.b3_3.addActionListener(this);</p><
36、p> jf.b3_4.addActionListener(this);</p><p> jf.b3_5.addActionListener(this);</p><p> jf.b3_6.addActionListener(this);</p><p> jf.b3_7.addActionListener(this);</p><
37、p><b> }</b></p><p> public void actionPerformed(ActionEvent e) {</p><p> if (e.getSource() == jf.b1_1) {</p><p><b> try {</b></p><p> n
38、= Integer.parseInt(jf.tf1_1.getText());</p><p> if (n >= 10 || n <= 0) {</p><p> jf.p2.removeAll();</p><p> jf.horizontal3_2.remove(jf.vertical3_2_1);</p><p>
39、 jf.p3.remove(jf.horizontal3_1);</p><p> jf.horizontal1_2.remove(jf.b1_2);</p><p> jf.ta.setText("請輸入1-9的維數(shù)N!");</p><p><b> } else {</b></p><p>
40、; jf.ta.setText("");</p><p> jf.initMatrix(n);</p><p><b> }</b></p><p> } catch (NumberFormatException nfe) {</p><p> jf.p2.removeAll();</
41、p><p> jf.horizontal3_2.remove(jf.vertical3_2_1);</p><p> jf.p3.remove(jf.horizontal3_1);</p><p> jf.horizontal1_2.remove(jf.b1_2);</p><p> jf.ta.setText("維數(shù)N輸入錯誤
42、,請重新輸入!");</p><p><b> }</b></p><p> } else if (e.getSource() == jf.b1_2) {</p><p> d = new double[n][n + 1];</p><p> for (int i = 0; i < d.lengt
43、h; i++) {</p><p> for (int j = 0; j < d[i].length; j++) {</p><p><b> try {</b></p><p> d[i][j] = Double.parseDouble(jf.tf2_1[i][j].getText());</p><p>
44、 jf.ta.setText("矩陣輸入正確,請選擇方法進行求解");</p><p> } catch (Exception e2) {</p><p> jf.ta.setText("輸入的矩陣不對,請重新輸入");</p><p><b> }</b></p><p>
45、;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> try {</b></p><p> if (e.getSource() == jf.b3_1) {</p>
46、<p> jf.ta.setText(str = new Gauss(n, d).getSb());</p><p> } else if (e.getSource() == jf.b3_2) {</p><p> jf.ta.setText(str = new LU(n, d).getSb());</p><p> } else if (e.
47、getSource() == jf.b3_3) {</p><p> jf.ta.setText(str = new Jacobi(n, d).getSb());</p><p> } else if (e.getSource() == jf.b3_4) {</p><p> jf.ta.setText(str = new Gauss_Seidel(n, d)
48、.getSb());</p><p> } else if (e.getSource() == jf.b3_5) {</p><p> jf.ta.setText(str = new SOR(n, d).getSb());</p><p><b> }</b></p><p> } catch (Exceptio
49、n e1) {</p><p> jf.ta.setText("請輸入正確的矩陣并且點擊“矩陣輸入好了”?。。?quot;);</p><p><b> }</b></p><p><b> //保存文件</b></p><p> if (e.getSource() == jf.b
50、3_6) {</p><p> FileWriter fw = null;</p><p><b> try {</b></p><p> if (str == null) {</p><p> jf.ta.setText("沒有任何可保存的數(shù)據(jù)?。。?quot;);</p><p&
51、gt;<b> } else {</b></p><p> jf.ta.setText("文件保存目錄C:\\保存.doc");</p><p> fw = new FileWriter("c:\\保存.doc", true);</p><p> SimpleDateFormat sdf = ne
52、w SimpleDateFormat("yyyy-MM-dd HH:mm:ss");</p><p> String time = "\n保存時間:" + sdf.format(new java.util.Date());</p><p> fw.write(time + "\n" + str + "\n"
53、);</p><p><b> }</b></p><p> } catch (Exception e1) {</p><p> jf.ta.setText("數(shù)據(jù)寫入異常!??!");</p><p> } finally {</p><p><b> tr
54、y {</b></p><p> if (fw != null) {</p><p> fw.close();</p><p><b> }</b></p><p> } catch (IOException e1) {</p><p> jf.ta.setText(&quo
55、t;數(shù)據(jù)寫入異常?。?!");</p><p><b> }</b></p><p><b> }</b></p><p> } else if (e.getSource() == jf.b3_7) {</p><p><b> // 打開文件</b></
56、p><p><b> try {</b></p><p> if (new File("C:\\保存.doc").exists()) {</p><p> Runtime.getRuntime().exec(</p><p> "C:\\Program Files (x86)\\Micr
57、osoft Office\\"</p><p> + "Office14\\winword.exe C:\\保存.doc");</p><p><b> } else {</b></p><p> jf.ta.setText("文件不存在,請先點擊保存!??!");</p>&
58、lt;p><b> }</b></p><p> } catch (IOException e1) {</p><p> jf.ta.setText("文件打開失敗?。。?quot;);</p><p><b> }</b></p><p><b> }</
59、b></p><p><b> }</b></p><p><b> //保留四位小數(shù)</b></p><p> public static double keep(double d) {</p><p> BigDecimal b = new BigDecimal(d);</p
60、><p> return b.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();</p><p><b> }</b></p><p><b> }</b></p><p> public class Jframe {</p>
61、<p> Frame f = new JFrame("數(shù)值分析:解線性方程組 作者:劉俊偉");</p><p> Panel p1 = new Panel();</p><p> Panel p2 = new Panel();</p><p> Panel p3
62、 = new Panel();</p><p> Label l1 = new Label("請輸入方程維數(shù)N:");</p><p> TextField tf1_1 = new TextField(5);</p><p> TextField[][] tf2_1;</p><p> Button b1_1 =
63、new Button("確定");</p><p> Button b1_2 = new Button("增廣矩陣輸入好了");</p><p> Box vertical1 = Box.createVerticalBox();</p><p> Box horizontal1_1 = Box.createHorizon
64、talBox();</p><p> Box horizontal1_2 = Box.createHorizontalBox();</p><p> Box vertical3 = Box.createVerticalBox();</p><p> Box horizontal3_1 = Box.createHorizontalBox();</p>
65、<p> Box horizontal3_2 = Box.createHorizontalBox();</p><p> Box vertical3_2_1 = Box.createVerticalBox();</p><p> Button b3_1 = new Button("高斯消去");</p><p> Butto
66、n b3_2 = new Button("LU分解");</p><p> Button b3_3 = new Button("Jacobi迭代");</p><p> Button b3_4 = new Button("Gauss-Seidel迭代");</p><p> Button b3_5 =
67、 new Button("SOR迭代");</p><p> Button b3_6 = new Button("保存文件");</p><p> Button b3_7= new Button("打開文件");</p><p> int N = 4;</p><p> do
68、uble[][] d;</p><p> TextArea ta = new TextArea("尊敬的用戶:\n" </p><p> +" 你好!\n"</p><p> +" 歡迎使用解線性方程組程序,線程方程組解法分兩種:直接法和迭代法。\n"</p><p&g
69、t; +"本程序提供的直接法有Gauss消去、LU分解,迭代法有Jacobi、Gauss_Seidel、\n" </p><p> +"SOR迭代法,你可以選擇你需要的方法進行求解。\n"</p><p> +" 如果本程序存在BUG,請聯(lián)系本人,本人將及時修復,謝謝使用!");</p><p>
70、; public void lauchMainFrame() {</p><p> //根據(jù)維數(shù)大小,矩陣自動變化</p><p> if(this.N < 5) {</p><p> f.setBounds(400, 40, 520, 650);</p><p><b> } else {</b><
71、;/p><p> f.setBounds(400-(N-4)*50, 70-(N-4)*5, 130*N, 600+(N-4)*10);</p><p><b> }</b></p><p><b> //三個面板</b></p><p> f.add(p1);</p><p
72、> f.add(p2);</p><p> f.add(p3);</p><p><b> // 面板一</b></p><p> p1.add(vertical1);</p><p> vertical1.add(horizontal1_1);</p><p> vertica
73、l1.add(horizontal1_2);</p><p> horizontal1_1.add(l1);</p><p> horizontal1_1.add(tf1_1);</p><p> horizontal1_1.add(b1_1);</p><p><b> // 面板三</b></p>
74、<p> p3.add(vertical3);</p><p> p3.add(horizontal3_2);</p><p> horizontal3_1.add(b3_1);</p><p> horizontal3_1.add(b3_2);</p><p> horizontal3_1.add(b3_3);<
75、;/p><p> horizontal3_1.add(b3_4);</p><p> horizontal3_1.add(b3_5);</p><p> horizontal3_2.add(ta);</p><p> vertical3_2_1.add(b3_6);</p><p> vertical3_2_1.
76、add(b3_7);</p><p> f.setLayout(new GridLayout(3, 1));</p><p> f.setVisible(true);</p><p><b> }</b></p><p> public void initMatrix(int n) {</p>&l
77、t;p> this.N = n;</p><p> //移除上次輸入的矩陣</p><p> p2.removeAll();</p><p> Panel[][] p = new Panel[n][n+1];</p><p> Label[][] labels = new Label[n][n+1];</p>&
78、lt;p> tf2_1 = new TextField[n][n+1];</p><p> p2.setLayout(new GridLayout(n, n+1));</p><p> for(int i = 0; i < tf2_1.length; i ++) {</p><p> for(int j = 0; j < tf2_1[i].
79、length; j++) {</p><p> p[i][j] = new Panel();</p><p> if(j < tf2_1[i].length-1) {</p><p> labels[i][j] = new Label("a"+(i+1)+(j+1));</p><p><b> }
80、 else {</b></p><p> labels[i][j] = new Label("常數(shù)項");</p><p><b> }</b></p><p> tf2_1[i][j] = new TextField(1);</p><p> p[i][j].add(labels
81、[i][j]);</p><p> p[i][j].add(tf2_1[i][j]);</p><p> p2.add(p[i][j]);</p><p><b> }</b></p><p><b> }</b></p><p> ta.setText("
82、;請輸入矩陣,輸好后請點擊“矩陣輸入好了”");</p><p> horizontal1_2.add(b1_2);</p><p> p3.add(horizontal3_1);</p><p> horizontal3_2.add(vertical3_2_1);</p><p> lauchMainFrame();<
83、;/p><p><b> }</b></p><p><b> }</b></p><p> public class Gauss {/* 高斯消去法*/</p><p> double a[][]; // 系數(shù)矩陣</p><p> double b[]; /
84、/ 常數(shù)</p><p> double x[]; // x的值</p><p> int n; // n階</p><p> StringBuilder sb = new StringBuilder("高斯消去法:\n\n");</p><p> public Gauss(int n, double[]
85、[] d) {</p><p> this.n = n;</p><p> a = new double[n][n];</p><p> b = new double[n];</p><p> x = new double[n];</p><p> for (int i = 0; i < n; i++)
86、 {</p><p> b[i] = d[i][n];</p><p> for (int j = 0; j < n; j++) {</p><p> a[i][j] = d[i][j];</p><p><b> }</b></p><p><b> }</b&g
87、t;</p><p> elimination();</p><p> back_substitution();</p><p><b> print2();</b></p><p><b> }</b></p><p><b> //簡單順序消去法<
88、;/b></p><p> private void elimination() {</p><p> for(int i = 0; i < n; i++) {</p><p> if(a[i][i] == 0) {</p><p> sb.append("對角元素"+a[i][i]+"為零,
89、程序終止!??!");</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> for(int k = 0; k < n; k++) {</p><p
90、> for(int i = k + 1; i < n; i++) {</p><p> double l = a[i][k] / a[k][k];</p><p> for(int j = k; j < n; j++) {</p><p> a[i][j] = a[i][j] - l * a[k][j];//消元</p>&l
91、t;p><b> }</b></p><p> b[i] = b[i] - l * b[k];</p><p><b> }</b></p><p> sb.append("第" + (k+1) + "次消去后的增廣矩陣為:\n");</p><p&
92、gt;<b> print1();</b></p><p><b> }</b></p><p><b> }</b></p><p> //回代法求解線性方程組的解</p><p> private void back_substitution() {</p&
93、gt;<p> x[n-1] = b[n-1] / a[n-1][n-1];</p><p> for (int i = n - 2; i >= 0; i--) {</p><p> x[i] = (b[i] - jisuan(i)) / a[i][i];</p><p><b> }</b></p>
94、<p><b> }</b></p><p> private double jisuan(int i) {</p><p> double d = 0.0;</p><p> for (int j = i + 1; j < n; j++) {</p><p> d = d + x[j] * a
95、[i][j];</p><p><b> }</b></p><p><b> return d;</b></p><p><b> }</b></p><p> private void print1() {</p><p> for (in
96、t i = 0; i < n; i++) {</p><p> for (int j = 0; j < n; j++) {</p><p> sb.append( LinearEquations.keep(a[i][j]) + "\t");</p><p><b> }</b></p>&l
97、t;p> sb.append(LinearEquations.keep(b[i]));</p><p> sb.append("\n");</p><p><b> } </b></p><p> sb.append("\n");</p><p><b>
98、 }</b></p><p> private void print2() {</p><p> sb.append("方程組的根為:\n");</p><p> for (int i = 0; i < n; i++)</p><p> sb.append("X" + (i+1
99、) + " = " + LinearEquations.keep(x[i])+"\t");</p><p><b> }</b></p><p> public String getSb() {</p><p> return this.sb.toString();</p><p
100、><b> }</b></p><p><b> }</b></p><p> public class LU { /* LU分解法*/</p><p> double a[][]; // 系數(shù)矩陣</p><p> double b[]; // 常數(shù)</p>&
101、lt;p> double x[]; // x的值</p><p> int n; // n階</p><p> double[][] l;</p><p> double[][] u;</p><p> double[] y;</p><p> StringBuilder sb = new
102、StringBuilder("LU分解法:\n\n");</p><p> LU(int n, double[][] d) {</p><p> this.n = n;</p><p> a = new double[n][n];</p><p> b = new double[n];</p><
103、;p> l = new double[n][n];</p><p> u = new double[n][n];</p><p> y = new double[n];</p><p> x = new double[n];</p><p> for (int i = 0; i < n; i++) {</p>
104、<p> b[i] = d[i][n];</p><p> for (int j = 0; j < n; j++) {</p><p> a[i][j] = d[i][j];</p><p><b> }</b></p><p><b> }</b></p>
105、<p> luResolve();</p><p> sb.append("y的值為:\n");</p><p> backSolvey();</p><p> sb.append("x的值為:\n");</p><p> backSolvex();</p><
106、;p><b> }</b></p><p><b> // LU分解法</b></p><p> private void luResolve() {</p><p> for (int j = 0; j < n; j++) {</p><p> u[0][j] = a[0][
107、j];</p><p><b> }</b></p><p> for (int i = 0; i < n; i++) {</p><p> l[i][0] = a[i][0] / u[0][0];</p><p> l[i][i] = 1;</p><p><b> }
108、</b></p><p> for (int r = 1; r < n; r++) {</p><p> for (int i = r; i < n; i++) {</p><p> u[r][i] = a[r][i] - jisuan1(r, i);</p><p><b> }</b>
109、</p><p> for (int i = r + 1; i < n; i++) {</p><p> l[i][r] = (a[i][r] - jisuan2(r, i)) / u[r][r];</p><p><b> }</b></p><p><b> }</b></p
110、><p> sb.append("單位下三角陣L為:\n");</p><p> print2(l);</p><p> sb.append("單位上三角陣U為:\n");</p><p> print2(u);</p><p><b> }</b>&
111、lt;/p><p> // 回代求出y的值</p><p> private void backSolvey() {</p><p> y[0] = b[0] / l[0][0];</p><p> for (int i = 1; i < n; i++) {</p><p> y[i] = (b[i] -
112、jisuany(i)) / l[i][i];</p><p><b> }</b></p><p> print1(y);</p><p><b> }</b></p><p> private double jisuany(int i) {//1</p><p>
113、 double sum = 0;</p><p> for (int k = 0; k < i; k++) {</p><p> sum = sum + l[i][k] * y[k];</p><p><b> }</b></p><p> return sum;</p><p>&
114、lt;b> }</b></p><p> // 回代求出x的值</p><p> private void backSolvex() {</p><p> x[n - 1] = y[n - 1] / u[n - 1][n - 1];</p><p> for (int i = n - 2; i >= 0; i
115、--) {</p><p> x[i] = (y[i] - jisuanx(i)) / u[i][i];</p><p><b> }</b></p><p> print1(x);</p><p><b> }</b></p><p> private doubl
116、e jisuanx(int i) {</p><p> double sum = 0;</p><p> for (int k = i + 1; k < n; k++) {</p><p> sum = sum + u[i][k] * x[k];</p><p><b> }</b></p>
117、<p> return sum;</p><p><b> }</b></p><p><b> // 打印一維矩陣</b></p><p> private void print1(double[] d) {</p><p> for (int i = 0; i < n;
118、 i++) {</p><p> sb.append(LinearEquations.keep(d[i]) + "\t");</p><p><b> }</b></p><p> sb.append("\n");</p><p><b> }</b>
119、</p><p><b> // 打印二維矩陣</b></p><p> private void print2(double array1[][]) {</p><p> for (int i = 0; i < n; i++) {</p><p> for (int j = 0; j < n; j+
120、+)</p><p> sb.append(LinearEquations.keep(array1[i][j]) + "\t");</p><p> sb.append("\n");</p><p><b> }</b></p><p> sb.append("\
121、n");</p><p><b> }</b></p><p> private double jisuan1(int r, int i) {</p><p> double sum = 0;</p><p> for (int k = 0; k <= r - 1; k++) {</p>
122、;<p> sum = sum + l[r][k] * u[k][i];</p><p><b> }</b></p><p> return sum;</p><p><b> }</b></p><p> private double jisuan2(int r, int
123、 i) {</p><p> double sum = 0;</p><p> for (int k = 0; k <= r; k++) {</p><p> sum = sum + l[i][k] * u[k][r];</p><p><b> }</b></p><p> re
124、turn sum;</p><p><b> }</b></p><p> public String getSb() {</p><p> return this.sb.toString();</p><p><b> }</b></p><p><b>
125、 }</b></p><p> public class Jacobi {/* Jacobi迭代法*/</p><p> double a[][]; // 系數(shù)矩陣</p><p> double b[]; // 常數(shù)數(shù)組</p><p> double x[]; // 方程的解數(shù)組</
126、p><p> int n; // n階</p><p> double x0[];</p><p> boolean th = true;</p><p> int count = 0;</p><p> double e = 0; // 精度</p><p> Str
127、ingBuilder sb = new StringBuilder("Jacobi迭代:\n\n");</p><p> public Jacobi(int n, double[][] d) {</p><p> this.n = n;</p><p> a = new double[n][n];</p><p>
128、 b = new double[n];</p><p> x0 = new double[n];</p><p> x = new double[n];</p><p> for (int i = 0; i < n; i++) {</p><p> b[i] = d[i][n];</p><p> fo
129、r (int j = 0; j < n; j++) {</p><p> a[i][j] = d[i][j];</p><p><b> }</b></p><p><b> }</b></p><p><b> e = 5;</b></p><
130、;p> iteration(e);</p><p><b> }</b></p><p> private void iteration(double e) {</p><p> for(int i = 0; i < n; i++) {</p><p> if(a[i][i] == 0) {<
131、/p><p> sb.append("對角元素"+a[i][i]+"為零,程序終止?。。?quot;);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p&g
132、t;<p> double sum = 0;</p><p> for (int i = 0; i < x0.length; i++) {</p><p> x0[i] = 1; //初值都為1</p><p><b> }</b></p><p> while (th) {</p&
133、gt;<p> if(count > 100) {</p><p> sb = new StringBuilder("Jacobi迭代:\n\n迭代次數(shù)超過100次,此線性方程采用Jacobi迭代應該不收斂");</p><p><b> break;</b></p><p><b>
134、}</b></p><p><b> count++;</b></p><p> for (int i = 0; i < x0.length; i++) {</p><p><b> sum = 0;</b></p><p> for (int j = 0; j <
135、x0.length; j++) {</p><p> if (i!=j) {</p><p> sum = sum + a[i][j] * x0[j];</p><p><b> }</b></p><p><b> }</b></p><p> x[i] = (b
136、[i] - sum) / a[i][i];</p><p><b> }</b></p><p> sb.append("第" + count + "次迭代的值:\n");</p><p> print1(x);</p><p> if (jisuan() < Mat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)值分析課程設計---線性方程組求解
- 線性方程組求解.doc
- 線性方程組求解.doc
- 求解無窮線性方程組.pdf
- 非線性方程組求解.doc
- 非線性方程組求解.doc
- 非線性方程組求解.doc
- 線性方程組求解的數(shù)值實驗報告
- 非線性方程組求解.doc
- 高等數(shù)值分析課程設計--求解線性方程組ax=b的極小化方法比較
- 共軛梯度法求解線性方程組
- 線性方程組
- 共軛梯度法求解線性方程組
- 數(shù)值方法課程設計---牛頓法解非線性方程組
- 結(jié)構(gòu)線性方程組的迭代求解.pdf
- 矩陣在線性方程組 求解的應用
- 最優(yōu)化算法課程設計--解方程組及非線性方程組
- 非對稱線性方程組的求解方法.pdf
- 學年論文線性方程組的求解及應用
- 《線性方程組》ppt課件
評論
0/150
提交評論