数值分析课程设计---线性方程组求解_第1页
已阅读1页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、<p>  课 程 设 计 报 告</p><p>  课程名称 数值分析 </p><p>  课题名称 线性方程组求解 </p><p>  专 业 信息与计算科学 </p><p>  班 级

2、 </p><p>  学 号 </p><p>  姓 名 </p><p>  指导教师 </p><p>  2012 年 12 月 13 日</p&g

3、t;<p>  一、设计内容与设计要求</p><p><b>  1.设计内容:</b></p><p>  对课程《计算方法》中的常见算法进行综合设计或应用(具体课题题目见后面的供选题目)。</p><p><b>  2.设计要求:</b></p><p>  课程设计报告正文内

4、容</p><p>  a.问题的描述及算法设计;</p><p>  b.算法的流程图(要求画出模块图);</p><p>  c.算法的理论依据及其推导;</p><p>  d.相关的数值结果(通过程序调试),;</p><p>  e.数值计算结果的分析;</p><p>  f.附件(

5、所有程序的原代码,要求对程序写出必要的注释)。</p><p><b>  书写格式</b></p><p>  a.要求用A4纸打印成册</p><p>  b.正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。</p><p>  c.正文的内容:正文总字数要求在3000字左右(不含

6、程序原代码)。</p><p>  d.封面格式如下页。</p><p><b>  考核方式</b></p><p>  指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:</p>

7、<p>  a.平时出勤 (占10%)</p><p>  b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)</p><p>  c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)</p><p>  d.设计报告(占30%)</p><p>  注意:不得抄袭他人的报告(或给他人抄

8、袭),一旦发现,成绩为零分。</p><p>  e.独立完成情况(占10%)。</p><p><b>  课程验收要求</b></p><p>  a.判定算法设计的合理性,运行相关程序,获得正确的数值结果。</p><p><b>  b.回答有关问题。</b></p><

9、p>  c.提交课程设计报告。</p><p>  d.提交软盘(源程序、设计报告文档)。</p><p>  e.依内容的创新程度,完善程序情况及对程序讲解情况打分。</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>  算法的理论依据及其推导…………………………………………(08)</p><p>  相关的数值结果……………………………………………………(12)</p><p>  数值计算结果的分析………………………………………………(15)</p><p>  附件…………………………………

14、………………………………(15)</p><p>  课程设计评分表……………………………………………………(31)</p><p>  一、问题的描述及算法设计</p><p><b>  1、问题描述:</b></p><p>  设有线性方程组,其中,为非奇异矩阵,方程组的增广矩阵为</p><

15、p>  在科技计算中,求解线性方程组的问题是经常遇到的,虽然线性代数课程中已涉及不少求解线性方程组的方法,但那是理论上的分析求解方法,不能简单套用到数值计算中。</p><p>  线性方程组的数值解法在计算方法课程中占有重要的地位。它大致分为迭代法和直接法两大类。</p><p><b>  2、算法设计</b></p><p><

16、;b>  2.1直接法:</b></p><p>  在不考虑舍入误差的情况下,经有限步四则运算求得精确解,当n<100及某些大型稀疏方程组、带型方程组常选用直接解法。</p><p>  最基本的直接解法是Gauss消去法,其他重要的直接解法全都受到Gauss消去法的启示,此外还有LU分解法。</p><p><b>  2.2迭

17、代法:</b></p><p>  基于一定迭代格式,产生逼近方程组精确解的近似序列,当n>100,特别是某些偏微分方程数值求解过程中出现的方程组常选用迭代解法。</p><p>  相关理论包括:迭代的收敛性、收敛速度问题、误差估计,常用的迭代法是:Jacobi迭代法、Gauss-Seidel迭代法、SOR方法。</p><p><b>

18、;  二、算法流程图:</b></p><p>  三、算法的理论依据及其推导</p><p><b>  高斯消去元法:</b></p><p>  首先在的第1列选取绝对值最大的元素作为主元素,即选择</p><p>  然后交换的第1行与第行(交换后增广矩阵为简单起见仍记为,其元素仍记为)。经过第1次消

19、元得到与原方程组等价的方程 ,</p><p><b>  其中,</b></p><p><b>  上述过程可记为 </b></p><p>  重复上述计算过程,现假设已完成第步的选主元素过程,交换两行并进行消元计算,此时约化为</p><p>  其中的元素仍记为,的元素仍记为.第步选主元

20、素(在右下角方阵的第1列内选),即确定,使</p><p>  交换第行与行的元素,再进行消元计算,最后将原线性方程组化为</p><p><b>  回代可求解得</b></p><p><b>  LU分解</b></p><p>  若线性方程组系数矩阵A的各阶顺序主子式都不为零,则一定存在唯

21、一的矩阵分解关系</p><p>  其中,L和U分别为下三角矩阵和上三角矩阵,他们的形式为</p><p>  这种特殊的分解形式称为矩阵的Doolittle分解。</p><p>  若线性方程组的,则线性方程组可变形为</p><p>  令,则,可分裂为两个等价的方程组</p><p>  由于L和U都是三角矩

22、阵,这两个方程组都可以通过简单的回代过程求解。可见,系数矩阵分解为求线性方程组带来可行性和方便。</p><p><b>  Jacobi迭代:</b></p><p>  根据方程组中第i个方程,将未知量Xi用其余的未知量表示出来。</p><p><b>  构造迭代格式:</b></p><p&g

23、t;  将上面的格式写成矩阵乘法的形式,等价与下面的矩阵方程</p><p>  其中,L,D,U分别是原方程组Ax=b中系数矩阵A的对角线下方元素、对角线元素、对角线上方元素构成的矩阵,即</p><p><b>  A=L+D+U</b></p><p>  可见,Jacobi迭代法中的迭代矩阵为</p><p> 

24、 Gauss-Seidel迭代法</p><p>  在Jacobi迭代法中,注意到计算 时,从一直到都已经计算好,然而Jacobi迭代法并没有利用这些最新的近似值进行下一步的计算,仍用第k步的各个x进行迭代。为此,我们对Jacobi迭代格式进行如下修改:</p><p>  一旦有未知量最新的近似值,下面就用最新结果进行迭代,这样可能使收敛速度加快,同时节省存储空间</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步的近似值时,实质上是在第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>  四、相关的数值结果</b></p><p><b>  1.输入方程

28、维数</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>  五、数值计算结果的分析</p><p>  当输入的线性方程组是收敛的,可以运

30、用高斯消主元法,当输入的方程组是收敛的,既可以用高斯消主元法也可以用三种迭代方法计算。</p><p>  当方程组不收敛时,高斯消主元法是求解线性方程组最常用的方法,只要矩阵A的行列式大于零,就可以解得相应的X。</p><p>  当方程组收敛时,将三种迭代法的解和高斯消主元的解进行比较会发现,当迭代次数K越大,其方程组的解的值越接近高斯消主元的解,且当迭代次数越大第K次的X[i]与第

31、(K-1)次的X[i]的绝对值越接近与零。</p><p>  六、附件(所有程序的原代码,要求对程序写出必要的注释)</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的按钮加监听</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的维数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("维数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("请输入正确的矩阵并且点击“矩阵输入好了”!!!");</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("没有任何可保存的数据!!!");</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("数据写入异常!!!");</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;数据写入异常!!!");</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("文件打开失败!!!");</p><p><b>  }</b></p><p><b>  }</

59、b></p><p><b>  }</b></p><p><b>  //保留四位小数</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("数值分析:解线性方程组 作者:刘俊伟");</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("请输入方程维数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,请联系本人,本人将及时修复,谢谢使用!");</p><p>

70、;  public void lauchMainFrame() {</p><p>  //根据维数大小,矩阵自动变化</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("常数项");</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[][]; // 系数矩阵</p><p>  double b[]; /

84、/ 常数</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[][]; // 系数矩阵</p><p>  double b[]; // 常数</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[][]; // 系数矩阵</p><p>  double b[]; // 常数数组</p><p>  double x[]; // 方程的解数组</

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]+"为零,程序终止!!!");</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迭代次数超过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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 众赏文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论