高分求计算行列式的值的方法 我需要求行列式的值,我现在用的方法是清华大学出版社的徐士良主编的《C常用算法程序集》中的全选主元高斯消去法(bsdet())求行列式的值。这个方法在阶数大于6或7后算法就不稳定,计算出的结果为0。现高分求一稳定的行列式值的计算方法,要求在高阶(10阶以上)情况下算法稳定,望高手们不吝赐教。多谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我搜的,你看看能不能用#include <stdio.h>#include <time.h>void main(){long now,before;int b,p,d,i,n,q,t,w;float a[500][500],e[500],k,num,v;char *strnow;n=1;printf("\t\t\t★☆行列式计算程序☆★\n\n"); while (n==1) { w=0;d=1;num=1;n=1;time(&now);before=now;strnow=ctime(&now);printf("请选择(1,2): 1.自行输入元素 2.计算连续自然数行列式:");scanf("%d",&n); switch (n){case 1:{ printf("\n请输入行列式的阶数:"); scanf("%d",&n); for (p=1;p<=n;p++) { for (i=1;i<=n;i++) { printf("请输入第%d行第%d个元素\t",p,i); scanf("%f",&a[p][i]); } } break;} case 2:{ printf("\n请输入n(n<500): "); scanf("%d",&n); for (i=0;i<=n;i++) { for (p=1;p<=n;p++) { a[i][p]=(float)(n*(p-1)+i); } }}}printf("\t正在对行列式进行计算!\n");for (p=1;p<=n;p++){for (i=1;i<=n;i++){if (i==1){printf("\n\t\t┃\t");} printf("%2.2f ",a[p][i]);if (i==n){printf("\t┃");}} }if (a[1][1]==0){for (i=2;i<=n;i++){if (a[i][1]!=0){for (t=1;t<=n;t++){e[t]=a[1][t];a[1][t]=a[i][t];a[i][t]=e[t];}w=1;break;}} if (w!=1){d=0;}} printf("\n"); for (b=1;b<=n-1;b++){ if (a[b][b]==0){for (i=b+1;i<=n;i++){if (a[i][b]!=0){for (t=b;t<=n;t++){e[t]=a[b][t];a[b][t]=a[i][t];a[i][t]=e[t];}w++;break;}} }for (p=b+1;p<=n;p++) { if (a[b][b]!=0) { k=a[p][b]/a[b][b]; for (i=b;i<=n;i++) { a[p][i]=a[p][i]-a[b][i]*k; } } } q=100*(b+1)/n; printf("─────────────已经完成%d%%────────────\r",q); for (p=1;p<=n;p++) { for (i=1;i<=n;i++) {if (i==1){} } }} printf("\n最后主对角线上的元素分别为:\n");for (p=1;p<=n;p++){printf("a%d%d=%f\t",p,p,a[p][p]);//fprintf(fp,"a%d%d=%f\t",p,p,a[p][p]);num=a[p][p]*num;}if (w%2==0){v=1;}else {v=-1;} printf("\n请选择(1,2) 1.继续 2.退出: ");scanf("%d",&n); } } 高阶时,若行列式中有几个很大的数,则返回08,9阶时返回值常为零。原版拷贝的程序。程序很难读a[]中存放行列式,n为行列式的阶数double bsdet(double a[],int n){ int i,j,k,is,js,l,u,v; double f,det,q,d; f=1.0; det=1.0; for (k=0; k<=n-2; k++) { q=0.0; for (i=k; i<=n-1; i++) for (j=k; j<=n-1; j++) { l=i*n+j; d=fabs(a[l]); if (d>q) { q=d; is=i; js=j;} } if (q+1.0==1.0) { det=0.0; return(det);} if (is!=k) { f=-f; for (j=k; j<=n-1; j++) { u=k*n+j; v=is*n+j; d=a[u]; a[u]=a[v]; a[v]=d; } } if (js!=k) { f=-f; for (i=k; i<=n-1; i++) { u=i*n+js; v=i*n+k; d=a[u]; a[u]=a[v]; a[v]=d; } } l=k*n+k; det=det*a[l]; for (i=k+1; i<=n-1; i++) { d=a[i*n+k]/a[l]; for (j=k+1; j<=n-1; j++) { u=i*n+j; a[u]=a[u]-d*a[k*n+j]; } } } det=f*det*a[n*n-1]; return(det);} 运行结果计算a1的行列式值为0出错代码如下:#include "stdio.h"#include "math.h"double bsdet(double a[],int n);int main(int argc, char* argv[]){ double a1[] = {1, 0, 0, 0, 0, 2e7, 0, 0, 1, 1.1e7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ,0 ,0, 0, 1, 0, 1.2e6, 0, 0, 0, 0 ,0, 1, 0, 0, 0, 0, 0, 0, 0, 1}; double b1[] = {11, 2, 31, 41, 5, 6, 7, 81, 9, 10, 111, 12, 13, 133, 14, 15, 16, 171, 18, 19, 201, 21, 22, 23, 24 ,25 ,261, 27, 28, 29, 30, 31, 321, 33 ,34, 35 }; double d1[] = {11, 2, 31, 41, 5, 234, 125,456,4576, 0, 81, 9, 10, 111, 23541452,346,4567,456, 0, 0, 14, 15, 164, 171,32234546,25,23675, 0, 0, 0, 21, 232, 23,6,25,23, 0 ,0 ,0, 0, 28, 2925,457,3564,25678, 0, 0, 0, 0 ,0, 35,23,379,257, 0, 0, 0, 0, 0, 0, 1, 3454,243, 0, 0, 0, 0, 0, 0, 0, 1, 23466, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; double c1[] ={1, 2, 3, 4, 2, 3, 4, 5, 7, 8, 8, 9, 10, 9, 8, 6}; double d = bsdet(a1, 7); printf("det(A)=%13.7e\n", d); d = bsdet(b1, 6); printf("det(B)=%13.7e\n", d); printf("det(c)=%13.7e\n", bsdet(c1, 4)); printf("det(d)=%13.7e\n", bsdet(d1, 9)); return 0;}double bsdet(double a[],int n){ int i,j,k,is,js,l,u,v; double f,det,q,d; f=1.0; det=1.0; for (k=0; k<=n-2; k++) { q=0.0; for (i=k; i<=n-1; i++) { for (j=k; j<=n-1; j++) { l=i*n+j; d=fabs(a[l]); if (d>q) { q=d; is=i; js=j; } } } //if (q+1.0==1.0) if (fabs(q)<1.0e-7) { det=0.0; return(det); } if (is!=k) { f=-f; for (j=k; j<=n-1; j++) { u=k*n+j; v=is*n+j; d=a[u]; a[u]=a[v]; a[v]=d; } } if (js!=k) { f=-f; for (i=k; i<=n-1; i++) { u=i*n+js; v=i*n+k; d=a[u]; a[u]=a[v]; a[v]=d; } } l=k*n+k; det=det*a[l]; for (i=k+1; i<=n-1; i++) { d=a[i*n+k]/a[l]; for (j=k+1; j<=n-1; j++) { u=i*n+j; a[u]=a[u]-d*a[k*n+j]; } } } det=f*det*a[n*n-1]; return(det);} 建议使用matlab现成的工具,一个函数完事! 谁有 c++ 2005入门经典 中文版 的啊 关于读取二进制文件的问题 关于读写大文件的问题 一个打印控件怎么控制多台打印机 如何替换掉IE的黙认下载对话框,改用我的? 为什么 我被告之没有权限删除贴子 --------向CSDNCOM高手提问-------什么是tearoff技术?--------------- .MFC CListCtrl问题 不同对话框之间的数据传递 Clistctrl控件!!! 有什么API可以取得鼠标光标在屏幕上的坐标 想做一个IE的插件, 过滤广告, 请大家提供方法和思路! 多谢!
#include <stdio.h>
#include <time.h>void main()
{long now,before;
int b,p,d,i,n,q,t,w;
float a[500][500],e[500],k,num,v;
char *strnow;
n=1;
printf("\t\t\t★☆行列式计算程序☆★\n\n");
while (n==1)
{
w=0;d=1;num=1;n=1;
time(&now);
before=now;
strnow=ctime(&now);printf("请选择(1,2): 1.自行输入元素 2.计算连续自然数行列式:");
scanf("%d",&n);
switch (n)
{
case 1:
{
printf("\n请输入行列式的阶数:");
scanf("%d",&n); for (p=1;p<=n;p++)
{
for (i=1;i<=n;i++)
{
printf("请输入第%d行第%d个元素\t",p,i);
scanf("%f",&a[p][i]);
}
}
break;
}
case 2:
{
printf("\n请输入n(n<500): ");
scanf("%d",&n); for (i=0;i<=n;i++)
{
for (p=1;p<=n;p++)
{
a[i][p]=(float)(n*(p-1)+i);
}
}
}
}
printf("\t正在对行列式进行计算!\n");
for (p=1;p<=n;p++)
{
for (i=1;i<=n;i++)
{
if (i==1)
{
printf("\n\t\t┃\t");
}
printf("%2.2f ",a[p][i]);if (i==n)
{printf("\t┃");}
}
}
if (a[1][1]==0)
{
for (i=2;i<=n;i++)
{
if (a[i][1]!=0)
{
for (t=1;t<=n;t++)
{
e[t]=a[1][t];
a[1][t]=a[i][t];
a[i][t]=e[t];
}
w=1;
break;
}}
if (w!=1)
{
d=0;
}
}
printf("\n"); for (b=1;b<=n-1;b++)
{
if (a[b][b]==0)
{
for (i=b+1;i<=n;i++)
{
if (a[i][b]!=0)
{
for (t=b;t<=n;t++)
{
e[t]=a[b][t];
a[b][t]=a[i][t];
a[i][t]=e[t];
}
w++;
break;
}}
}for (p=b+1;p<=n;p++)
{
if (a[b][b]!=0)
{
k=a[p][b]/a[b][b];
for (i=b;i<=n;i++)
{
a[p][i]=a[p][i]-a[b][i]*k;
}
}
}
q=100*(b+1)/n;
printf("─────────────已经完成%d%%────────────\r",q); for (p=1;p<=n;p++)
{
for (i=1;i<=n;i++)
{
if (i==1)
{}
}
}
}
printf("\n最后主对角线上的元素分别为:\n");for (p=1;p<=n;p++)
{
printf("a%d%d=%f\t",p,p,a[p][p]);
//fprintf(fp,"a%d%d=%f\t",p,p,a[p][p]);
num=a[p][p]*num;
}if (w%2==0){v=1;}
else {v=-1;}
printf("\n请选择(1,2) 1.继续 2.退出: ");
scanf("%d",&n);
}
}
8,9阶时返回值常为零。原版拷贝的程序。
程序很难读a[]中存放行列式,n为行列式的阶数
double bsdet(double a[],int n)
{
int i,j,k,is,js,l,u,v;
double f,det,q,d;
f=1.0; det=1.0;
for (k=0; k<=n-2; k++)
{ q=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; d=fabs(a[l]);
if (d>q) { q=d; is=i; js=j;}
}
if (q+1.0==1.0)
{ det=0.0;
return(det);}
if (is!=k)
{ f=-f;
for (j=k; j<=n-1; j++)
{ u=k*n+j; v=is*n+j;
d=a[u]; a[u]=a[v]; a[v]=d;
}
}
if (js!=k)
{ f=-f;
for (i=k; i<=n-1; i++)
{ u=i*n+js; v=i*n+k;
d=a[u]; a[u]=a[v]; a[v]=d;
}
}
l=k*n+k;
det=det*a[l];
for (i=k+1; i<=n-1; i++)
{ d=a[i*n+k]/a[l];
for (j=k+1; j<=n-1; j++)
{ u=i*n+j;
a[u]=a[u]-d*a[k*n+j];
}
}
}
det=f*det*a[n*n-1];
return(det);
}
#include "stdio.h"
#include "math.h"double bsdet(double a[],int n);int main(int argc, char* argv[])
{
double a1[] = {1, 0, 0, 0, 0, 2e7, 0,
0, 1, 1.1e7, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0,
0 ,0 ,0, 0, 1, 0, 1.2e6,
0, 0, 0, 0 ,0, 1, 0,
0, 0, 0, 0, 0, 0, 1};
double b1[] = {11, 2, 31, 41, 5, 6,
7, 81, 9, 10, 111, 12,
13, 133, 14, 15, 16, 171,
18, 19, 201, 21, 22, 23,
24 ,25 ,261, 27, 28, 29,
30, 31, 321, 33 ,34, 35
}; double d1[] = {11, 2, 31, 41, 5, 234, 125,456,4576,
0, 81, 9, 10, 111, 23541452,346,4567,456,
0, 0, 14, 15, 164, 171,32234546,25,23675,
0, 0, 0, 21, 232, 23,6,25,23,
0 ,0 ,0, 0, 28, 2925,457,3564,25678,
0, 0, 0, 0 ,0, 35,23,379,257,
0, 0, 0, 0, 0, 0, 1, 3454,243,
0, 0, 0, 0, 0, 0, 0, 1, 23466,
0, 0, 0, 0, 0, 0, 0, 0, 1
}; double c1[] ={1, 2, 3, 4,
2, 3, 4, 5,
7, 8, 8, 9,
10, 9, 8, 6};
double d = bsdet(a1, 7);
printf("det(A)=%13.7e\n", d); d = bsdet(b1, 6);
printf("det(B)=%13.7e\n", d); printf("det(c)=%13.7e\n", bsdet(c1, 4));
printf("det(d)=%13.7e\n", bsdet(d1, 9));
return 0;
}double bsdet(double a[],int n)
{
int i,j,k,is,js,l,u,v;
double f,det,q,d;
f=1.0; det=1.0; for (k=0; k<=n-2; k++)
{
q=0.0;
for (i=k; i<=n-1; i++)
{
for (j=k; j<=n-1; j++)
{
l=i*n+j;
d=fabs(a[l]);
if (d>q)
{
q=d;
is=i;
js=j;
}
}
}
//if (q+1.0==1.0)
if (fabs(q)<1.0e-7)
{
det=0.0;
return(det);
}
if (is!=k)
{
f=-f;
for (j=k; j<=n-1; j++)
{
u=k*n+j;
v=is*n+j;
d=a[u];
a[u]=a[v];
a[v]=d;
}
}
if (js!=k)
{
f=-f;
for (i=k; i<=n-1; i++)
{
u=i*n+js;
v=i*n+k;
d=a[u];
a[u]=a[v];
a[v]=d;
}
}
l=k*n+k;
det=det*a[l];
for (i=k+1; i<=n-1; i++)
{
d=a[i*n+k]/a[l];
for (j=k+1; j<=n-1; j++)
{
u=i*n+j;
a[u]=a[u]-d*a[k*n+j];
}
}
} det=f*det*a[n*n-1];
return(det);
}