|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#define N 6
//声明高斯消元函数
void gaussian_elimination(float a[N][N+1]);
int main(){
//设定矩阵系数与常数项
float a[N][N+1]={
{0,0,0,0,0,1,1},
{0,0,0,0,1,0,1},
{0,0,0,1,0,0,1},
{1,1,1,1,1,1,6},
{5,4,3,2,1,0,15},
{20,12,6,2,0,0,40},
};
gaussian_elimination(a);
//代入高斯消元函数
return 0;
}
void gaussian_elimination(float a[N][N+1]){
int i,j,k;
float factor;
for(k=0;k<N;k++){
for(i=k+1;i<N;i++){
factor = a[i][k]/a[k][k];
for(j=k;j<N+1;j++){
a[i][j] -= factor*a[k][j];
}
}
}
float x[N];//存放结果的数组
for(i = N - 1;i>=0;i--){
x[i]=a[i][N];
for(j = i+1;j<N;j++){
x[i] -= a[i][j]*x[j];
}
x[i]/=a[i][i];
}
printf("结果为:\n");
for(i=0;i<N;i++){
printf("x[%d] = %f\n",i,x[i]);
}
}
数组越界: 在高斯消元的过程中,你尝试访问a[i][j]时,j的值可以达到N+1,这会导致数组越界,因为a是一个N x (N+1)的数组,所以j的最大值应该是N。
主元选择: 在高斯消元过程中,如果主元a[k][k]为0,那么你需要进行行交换,以确保每一步的消元都能正常进行。
回代过程: 在回代过程中,你计算x[i]时,应该从k=0开始,而不是i+1。
试试这个:
#include <stdio.h>
#define N 6
// 声明高斯消元函数
void gaussian_elimination(float a[N][N+1]);
int main() {
// 设定矩阵系数与常数项
float a[N][N+1] = {
{0, 0, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 1, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 6},
{5, 4, 3, 2, 1, 0, 15},
{20, 12, 6, 2, 0, 0, 40},
};
gaussian_elimination(a);
// 代入高斯消元函数
return 0;
}
void gaussian_elimination(float a[N][N+1]) {
int i, j, k;
float factor;
for (k = 0; k < N; k++) {
// 主元归一化
if (a[k][k] == 0) {
int found = 0;
for (i = k + 1; i < N; i++) {
if (a[i][k] != 0) {
for (j = 0; j < N + 1; j++) {
float temp = a[k][j];
a[k][j] = a[i][j];
a[i][j] = temp;
}
found = 1;
break;
}
}
if (!found) {
printf("方程组无唯一解\n");
return;
}
}
for (i = k + 1; i < N; i++) {
factor = a[i][k] / a[k][k];
for (j = k; j < N + 1; j++) {
a[i][j] -= factor * a[k][j];
}
}
}
float x[N] = {0}; // 存放结果的数组
for (i = N - 1; i >= 0; i--) {
x[i] = a[i][N];
for (j = i + 1; j < N; j++) {
x[i] -= a[i][j] * x[j];
}
x[i] /= a[i][i];
}
printf("结果为:\n");
for (i = 0; i < N; i++) {
printf("x[%d] = %f\n", i, x[i]);
}
}
|
|