當前位置:編程學習大全網 - 編程語言 - 求壹道五元方程用C#或C++解答

求壹道五元方程用C#或C++解答

這個線性方程組可以用,矩陣求逆,再相乘來解決吧。我有段代碼:

bool _stdcall InverseMatrix(double a[], int n=dim) //求任意階矩陣逆矩陣的函數

{ //采用高斯-約旦法

int *is,*js,i,j,k,l,u,v;

double d,p;

is=new int[n];

js=new int[n];

//第壹步 全選主元

for (k=0; k<=n-1; k++)

{

d=0.0;

for (i=k; i<=n-1; i++)

for (j=k; j<=n-1; j++)

{

l=i*n+j;

p=fabs(a[l]);

if (p>d) //從第 k 行、第 k 列開始的右下角子陣中選取絕對值最大的元素並記住次元素所在的行號和列號

{

d=p;

is[k]=i;//記錄行號

js[k]=j;//記錄列號

}

}

if (d+1.0==1.0)

{

delete []is; delete []js;

for(i=0;i<n;i++)

a[i]=0.0;

return false;

}

//通過行交換和列交換將它交換到主元素位置上

if (is[k]!=k)

for (j=0; j<=n-1; j++)

{

u=k*n+j; v=is[k]*n+j;

p=a[u]; a[u]=a[v]; a[v]=p; //行交換

}

if (js[k]!=k)

for (i=0; i<=n-1; i++)

{

u=i*n+k; v=i*n+js[k];

p=a[u]; a[u]=a[v]; a[v]=p; //列交換

}

l=k*n+k;

a[l]=1.0/a[l];

for (j=0; j<=n-1; j++)

if (j!=k)

{

u=k*n+j;

a[u]=a[u]*a[l];

}

for (i=0; i<=n-1; i++)

if (i!=k)

for (j=0; j<=n-1; j++)

if (j!=k)

{

u=i*n+j;

a[u]=a[u]-a[i*n+k]*a[k*n+j];

}

for (i=0; i<=n-1; i++)

if (i!=k)

{

u=i*n+k; a[u]=-a[u]*a[l];

}

}

//根據記錄的行號列號進行恢復

for (k=n-1; k>=0; k--)

{

if (js[k]!=k)

for (j=0; j<=n-1; j++)

{

u=k*n+j; v=js[k]*n+j;

p=a[u]; a[u]=a[v]; a[v]=p;

}

if (is[k]!=k)

for (i=0; i<=n-1; i++)

{

u=i*n+k; v=i*n+is[k];

p=a[u]; a[u]=a[v]; a[v]=p;

}

}

delete []is;

delete []js;

return true;

}

//矩陣乘法a*b=c

void _stdcall Matrixmul(double a[], double b[],double c[],int m=dim,int n=dim,int k=dim)

{ //其中a為m*n階矩陣,b為n*k階矩陣

int i,j,l,u;

for (i=0; i<=m-1; i++)

for (j=0; j<=k-1; j++)

{

u=i*k+j; c[u]=0.0;

for (l=0; l<=n-1; l++)

c[u]=c[u]+a[i*n+l]*b[l*k+j];

}

return;

}

這個兩個函數壹個求矩陣的逆,壹個是矩陣相乘。妳做個程序調用他們就可以了。當然這個方法的前提是系數矩陣可逆哈。

  • 上一篇:無憂編程
  • 下一篇:二次元的軟件功能
  • copyright 2024編程學習大全網