一、运行结果展示:

二阶等差数列通项计算公式 用消元法求多阶等差数列通项公式(1)

二、关键词:多阶等差数列,通项公式,C语言,三维数组,消元法,自动生成n*n个未知数的系数,解线性方程组

三、有关说明:

1.系数用三维数组a[k][i][j]存储:其中,[k]为组数(消元遍数),[i]为行数(组内方程个数),[j]为列数(方程内的项数);常数项用二维数组b[k][i]存储:其中,[k]为组数,[i]为行数;未知数用一维数组x[j]存储,[j]为项数(未知数编号)。

2.由于此类方程组中方程的系数是关于自然数n的n-1次多项式形式,可以用程序自动生成,所以只需要从键盘输入方程的个数n和n个常数项,就可以自动生成n*n个未知数的系数,并直接求出方程组的n个未知数,从而大大减少了输入数据的工作量。

3.由于原方程组以及消元后的所有新方程组中末项未知数的系数都分别相等,因此,只需直接相减就能消掉末项未知数,简化了解法。

四、用C语言程序实现:

//三维数组消元法解系数为i^(n-1)形式的n元线性次方程组

//方程形式为:i^(n-1)*x1 i^(n-2)*x2 …i*x(n-1) xn=bi,(其中i为自然数,且i从1到n)

#include <stdio.h>

#include <math.h>

#define N 15 //常数N应大于方程个数n

int main ()

{ int k,i,j,n,m=1; //循环变量k,i,j;未知数元数(方程个数)n,未知数编号m

double a[N][N][N]={},b[N][N]={},x[N]={}; //系数数组a(三维),常数项数组b(二维),未知数数组x(一维)

printf("请输入方程个数n及n个常数项:");

printf("n b[1][1] b[1][2] …b[1][n](相互用空格隔开):");

scanf("%d",&n); //读入未知数元数(方程个数)n

for(i=1;i<=n;i ) { scanf("%lf",&b[1][i]);} //读入n个常数项b

printf("所解方程组为:\n");

for(i=1;i<=n;i ) //自动生成原方程组的n*n个系数:

{ for(j=1;j<=n;j )

{ a[1][i][j]=pow(i,n-j); //自动生成系数:i^(n-j)

if(j !=1)printf("% -.0fx%d",a[1][i][j],j);

else printf(" %.0fx%d",a[1][i][j],j); //输出系数项

}

printf("=%.0f\n",b[1][i]); //输出常数项

}

//逐步消元:

for(k=2;k<=n;k ) //组数(消元遍数)k

{ printf("消掉末项未知数得:\n");

for(i=k;i<=n;i ) //行数(方程数)i

{ for(j=1;j<=n 1-k;j ) //列数(项数)j

{ a[k][i][j]=a[k-1][i][j]-a[k-1][i-1][j]; //求未知数项系数:本行=上组本行-上组上行

if(j !=1)printf("% -.0fx%d",a[k][i][j],j);

else printf(" %.0fx%d",a[k][i][j],j); //输出未知数项

}

b[k][i]=b[k-1][i]-b[k-1][i-1]; //求新的常数项

printf("=%.0f\n",b[k][i]); //输出常数项

}

}

x[1]=b[n][n]/a[n][n][1]; //求未知数x[1]的值

printf("解得:\n x[1]=%f \n",x[1]); //输出x[1]

//倒过来把解代入求其它未知数的值:

for(k=n-1;k>=1;k--) //求x[2]到x[m]:

{ for(j=1;j<=n-k;j ) { b[k][k]-=a[k][k][j]*x[j];} //把未知数代入并求差

m ; //未知数编号m

x[m]=b[k][k]/a[k][k][j]; //求x[m]

printf(" x[%d]=%f\n",m,x[m]); //输出未知数x[m])的值

}

return 0;

}

,