⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example3_10.java

📁 清华大学2002年出版的《科学与工程数值计算算法Java》配套源码
💻 JAVA
字号:
import java.applet.*;
import java.awt.*;
public class Example3_10 extends Applet
{
 public static boolean xishusolve(int[] row,int[] col,double[] value,double[] x,double eps)
  { int i,m=row.length,n=x.length,j,k,l,r;
    int[] p=new int[n];
    double temp,max;
    double[] y=new double[n];
    double[] z=new double[n];
    boolean falg=true;
    for(i=0;i<n;i++)p[i]=i;
    for(i=0;i<n;i++)
    {  //找主元用k,l记主元的行号列号,r记主元的位置。
	   max=-1;r=0;k=i;l=i;
	   for(j=0;j<m;j++)
       { if((row[j]>=i)&&(col[j]>=i))
         { temp=Math.abs(value[j]);
           if (temp>max){max=temp;k=row[j];l=col[j];r=j;}
          }
       }
	    if (max<1e-30){return false;}
        //第i行与第k行互换
	    for(j=0;j<m;j++)
	     {if(row[j]==i)row[j]=k;
	      else if(row[j]==k)row[j]=i;}
	    temp=x[i];x[i]=x[k];x[k]=temp;
        //第i行归一化,顺便检查此行是否对角占优。
          temp=0;
          for(j=r-1;j>=0;j--)
          {if(row[j]!=i)break;
           value[j]/=value[r];temp+=Math.abs(value[j]);}
           for(j=r+1;j<m;j++)
		   {if(row[j]!=i)break;
           value[j]/=value[r];temp+=Math.abs(value[j]);}
          x[i]/=value[r];value[r]=1;
        if(temp>=1)falg=false;
        //第i列和第l列交换
	    for(j=0;j<m;j++)
	    {if(col[j]==i)col[j]=l;
	     else if(col[j]==l)col[j]=i;}
	    k=p[i];p[i]=p[l];p[l]=k;
   }
	    if(!falg)
        {return false; }

	  //jacobi迭代
	 for(i=0;i<n;i++)y[i]=x[i];
	 for(k=0;k<10000;k++)
	 { for(i=0;i<n;i++)z[i]=x[i];
	   for(j=0;j<m;j++)
	   {if (row[j]==col[j])continue;
	    z[row[j]]-=value[j]*y[col[j]];}
      falg=true;
      for(i=0;i<n;i++)
	  if(Math.abs(y[i]-z[i])>=eps){falg=false;break;}
	  if(falg)break;
	  for(i=0;i<n;i++)y[i]=z[i];
	 }
	  //输出结果
	  for(i=0;i<n;i++)x[p[i]]=z[i];
	  return true;
	}


  public void paint(Graphics g)
  {int[] row={0,0,1,1,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7};
   int[] col={2,6,1,5,3,7,0,5,7,2,6,0,4,7,1,3,2,5,7};
   double[] value={-1,2,7,-6,2,-4,4,-2,1,6,5,1,-4,2,3,-4,1,4,-2};
   double[] x={4,6,-8,7,27,-13,8,-4};
   double eps=1e-7;
  if( xishusolve(row,col,value,x,eps))
   {for(int i=0;i<8;i++)
    g.drawString("X"+i+"="+x[i],10,i*20+20);}
  else
   g.drawString("矩阵无法进行迭代或矩阵不是对角占优矩阵",10,20);
 }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -