?? guass.cs
字號:
using System;
namespace szfx
{
/// <summary>
/// Summary description for Guass.
/// </summary>
public class Guass : szfx.matrix
//Guass消去法
{
public Guass()
{
//
// TODO: Add constructor logic here
//
}
//找出行列式a中j列的最大行
public int FindMaxiall(float[,] a,int j1)
{
int maxi,maxj;
int i,j;
float temp;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
int i_return = -1;
j = j1;
if( j > maxj )
return -1;
j--;
temp = a[0,j];
for(i=1;i<maxi;i++)
{
if(temp < a[i,j])
{
temp = a[i,j];
i_return = i;
}
}
return i_return;
}
//找出行列式a中j級子式的最大行
int FindMaxi(float[,] a,int j1)
{
int maxi,maxj;
int i,j;
float temp;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
int i_return = -1;
j = j1;
if( j > maxj )
return -1;
j--;
temp = a[0,j];
for(i=j+1;i<maxi;i++)
{
if(temp < a[i,j])
{
temp = a[i,j];
i_return = i;
}
}
return i_return;
}
//將對角增廣陣返回行列式的值,并就得向量x在增廣部分
static float ansA(float[,] a)
{
int maxi,maxj,i,j,k;
float r_f;
r_f = 1f;
maxi =a.GetLength(0);
maxj = a.GetLength(1);
for(i = 0;i < maxi;i++)
{
a[i,maxj - 1] = a[i,maxj - 1] / a[i,i];
r_f *= a[i,i];
}
return r_f;
}
//打印增廣矩陣的x向量
public static void printx(float[,] a)
{
int maxi,maxj,i,j;
float x;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
for(i = 0;i < maxi;i++)
Console.WriteLine("X{0}:{1}",i,a[i,maxj - 1]);
}
//一行乘以x
bool divide_i(float[,] a,int i,float x)
{
int maxi,maxj,j;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
for(j = 0;j <maxj;j++)
a[i,j] = a[i,j] * x;
return true;
}
//一列乘以x
bool divide_j(float[,] a,int j,float x)
{
int maxi,maxj,i;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
for(i = 0;i <maxi;i++)
a[i,j] = a[i,j] * x;
return true;
}
//一行加x
bool add_i(float[,] a,int i,float x)
{
int maxi,maxj,j;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
if(i > maxi)
return false;
i--;
for(j = 0;j < maxj;j++)
a[i,j] = a[i,j] + x;
return true;
}
//一列加x
bool add_j(float[,] a,int j,float x)
{
int maxi,maxj,i;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
if(j > maxj)
return false;
j--;
for(i = 0;i <maxi;i++)
a[i,j] = a[i,j] + x;
return true;
}
//a為增廣陣
public static float isdet(float[,] a)
{
eliminant(a);
eliminant2(a);
return ansA(a);
}
static float[,] athwart(float[,] a) //求矩陣的逆
{
int maxi,maxj,i,j;
float[,] b;
float det;
b = copyAtoB(a);
maxi = a.GetLength(0);
maxj = a.GetLength(1);
eliminant(b);
eliminant2(b);
det = ansA(b);
for(i=0;i<maxi;i++)
{
b[i,i] = det - b[i,i];
}
return b;
}
static float[,] copyAtoB(float[,] a)
{
int maxi,maxj,i,j;
maxi = a.GetLength(0);
maxj = a.GetLength(1);
float[,] b = new float[maxi,maxj];
for(i = 0;i < maxi;i++)
for(j = 0;j < maxj;j++)
b[i,j] = a[i,j];
b = disBtoA(b);
return b;
}
static float[,] disBtoA(float[,] a)//將增廣陣變成普通陣
{
int maxi,maxj,i,j;
maxi = a.GetLength(0);
maxj = a.GetLength(1)-1;
float[,] b = new float[maxi,maxj];
for(i = 0;i < maxi;i++)
for(j = 0;j < maxj;j++)
b[i,j] = a[i,j];
return b;
}
public static bool run()
{
float[,] A ={{3,4,1},{2,5,3},{1,4,6}};
float[] b ={1,2,3};
float[,] B;
float[,] Bn;
float det;
B = Guass.addAb(A,b);//增廣陣B;
printhls(B);
det = isdet(B);
printx(B); //打印增廣陣的X向量組
Console.WriteLine("det = {0}",det);
Bn = athwart(B); //球矩陣的逆
printhls(Bn);
return true;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -