All pastes #466714 Raw Edit

gausian matrix eq so

public text v1 · immutable
·published 2007-05-01 04:04 UTC
rendered paste body
import java.io.*;
import java.util.*;
import java.util.regex.*;

import static java.lang.System.*;


public class prtestmat
{
  public static void main(String argv[])  throws Throwable
  {
  		Scanner cin=new Scanner(new File("prtestmat.dat"));
		int timesToGo = cin.nextInt();
		cin.nextLine();
		String[] g = new String[timesToGo];
		for(int asdf=0; asdf<timesToGo; asdf++)
		{
			int n = cin.nextInt();
			double a[][] = new double[n][n];
			double b[] = new double[n];
			int ind[] = new int[n];
			for(int y =0;y<n;y+=1)
			{
				for(int  x=0;x<n;x+=1)
				{
					a[y][x] = cin.nextDouble();
				}
				b[y] = cin.nextDouble();
			}
			double x[] = solve(a, b, ind);
			
    	 for (int i=0; i<n; i++)
      		System.out.println(""+(char)('a'+i)+" = " + Math.round(x[i]));
      	}
  }

  public static double[] solve(double a[][],double b[], int ind[]) 
  {
    int n = b.length;
    double x[] = new double[n];

    gausiate(a, ind);

    for(int i=0; i<n-1; ++i) 
    {
	      for(int j =i+1; j<n; ++j) 
	      {
	        	b[ind[j]] -= a[ind[j]][i]*b[ind[i]];
	      }
    }

    x[n-1] = b[ind[n-1]]/a[ind[n-1]][n-1];
    
    for (int i=n-2; i>=0; --i) 
    {
	      x[i] = b[ind[i]];
	      
	      for (int j=i+1; j<n; ++j) 
	      {
	        	x[i] -= a[ind[i]][j]*x[j];
	      }
	      
	      x[i] /= a[ind[i]][i];
    }
    return x;
  }


  public static void gausiate(double a[][],int ind[]) 
  {
	    int n = ind.length;
	    double c[] = new double[n];
	
	    for (int i=0; i<n; ++i) 
	    	ind[i] = i;
	
	    for (int i=0; i<n; ++i) {
		      double c1 = 0;
		      for (int j=0; j<n; ++j) 
		      {
			        double c0 = Math.abs(a[i][j]);
			        if (c0 > c1) c1 = c0;
			  }
		      c[i] = c1;
	    }
	
	    int k = 0;
	    for (int j=0; j<n-1; ++j) 
	    {
	      	double pivind1 = 0;
	      	for (int i=j; i<n; ++i) 
	      	{
	        	double pivind0 = Math.abs(a[ind[i]][j]);
	        	pivind0 /= c[ind[i]];
	        	
	        	if (pivind0 > pivind1) 
	        	{
	          		pivind1 = pivind0;
	          		k = i;
	        	}
	    	}
	
	      	int itmp = ind[j];
	      	ind[j] = ind[k];
	      	ind[k] = itmp;
	      	for (int i=j+1; i<n; ++i) 
	      	{
	        	double pj = a[ind[i]][j]/a[ind[j]][j];
	
	        	a[ind[i]][j] = pj;
	
	        	for (int l=j+1; l<n; ++l)
	          		a[ind[i]][l] -= pj*a[ind[j]][l];
	      	}
    	}
  }
}