加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 zaiy2863 于 2016-9-17 14:08 编辑
在@RyanBern 的指导下随手写了一发、、、……
但是最高只能支持到阶数n=51 再继续增加会有误差的说(๑• . •๑)
编译器gcc
基本思路是采用高斯消元法、的说
……测试函数保留着,但是已经注释掉了
以及、最喜欢@⑨姐姐 了……
希望⑨姐姐不要嫌弃叶子太笨……(๑• . •๑)
代码如下:
#include <stdio.h> #include <math.h> #include <stdlib.h> void test_mat_gen(int n, double *a, double *b); int main(){ //输入待计算的矩阵 int n; scanf("%d",&n); //n = 84; double A[n*n];//第j列第i行写作A[j*n + i] int i,j,k; double b[n+1]; for(i = 0; i<n*n; i++){ A[i] = 0.0; } for(i = 0; i<n+1; i++){ b[i] = 0.0; } //test_mat_gen(n, A, b);//测试函数 //录入 for(i = 0; i<n*n; i++){ scanf("%lf", &A[i]); } for(i = 0; i<n; i++){ scanf("%lf", &b[i]); } //高斯消元法:对于每个i,j double q; k = 0; for(k = 0; k<n; k++){//从A[k*n +k]开始计数 for(j = k+1; j<n; j++){//列增加,以j计数 q =(double) A[j*n + k]/ A[k*n + k] ; //if(q)printf("%f\n", q); for(i = 0; i<n; i++){//j为列 i为行 则固定行数,对列数增加 A[j*n + i] -= q * A[k*n + i]; } b[j] -= q* b[k]; } } //得出结果 for(i = n-1; i>=0; i--){//对于每个b[i],减去已经算得的b[i],用于存储x[i]值 for(j = i+1; j>i; j--){ b[i] -= b[j]*A[i*n + j];//b[i]写在第i行 } b[i] /= A[i * n + i]; } for(i = 0; i<n; i++){ printf("%f\n", b[i]); } return 0; } /* void test_mat_gen(int n, double *a, double *b){ int i; for(i = 0; i<n; i++){ a[i * n + i] = 6; if(i < n - 1){ a[(i+1)*n + i] = 1; } if(i){ a[(i-1)*n + i] = 8; } if(i == 0){ b[i] = 14; }else if(i == n-1){ b[i] = 7; }else{ b[i] = 15; } } } */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void test_mat_gen(int n, double *a, double *b);
int main(){
//输入待计算的矩阵
int n;
scanf("%d",&n);
//n = 84;
double A[n*n];//第j列第i行写作A[j*n + i]
int i,j,k;
double b[n+1];
for(i = 0; i<n*n; i++){
A[i] = 0.0;
}
for(i = 0; i<n+1; i++){
b[i] = 0.0;
}
//test_mat_gen(n, A, b);//测试函数
//录入
for(i = 0; i<n*n; i++){
scanf("%lf", &A[i]);
}
for(i = 0; i<n; i++){
scanf("%lf", &b[i]);
}
//高斯消元法:对于每个i,j
double q;
k = 0;
for(k = 0; k<n; k++){//从A[k*n +k]开始计数
for(j = k+1; j<n; j++){//列增加,以j计数
q =(double) A[j*n + k]/ A[k*n + k] ;
//if(q)printf("%f\n", q);
for(i = 0; i<n; i++){//j为列 i为行 则固定行数,对列数增加
A[j*n + i] -= q * A[k*n + i];
}
b[j] -= q* b[k];
}
}
//得出结果
for(i = n-1; i>=0; i--){//对于每个b[i],减去已经算得的b[i],用于存储x[i]值
for(j = i+1; j>i; j--){
b[i] -= b[j]*A[i*n + j];//b[i]写在第i行
}
b[i] /= A[i * n + i];
}
for(i = 0; i<n; i++){
printf("%f\n", b[i]);
}
return 0;
}
/*
void test_mat_gen(int n, double *a, double *b){
int i;
for(i = 0; i<n; i++){
a[i * n + i] = 6;
if(i < n - 1){
a[(i+1)*n + i] = 1;
}
if(i){
a[(i-1)*n + i] = 8;
}
if(i == 0){
b[i] = 14;
}else if(i == n-1){
b[i] = 7;
}else{
b[i] = 15;
}
}
}
*/
|