谁能帮我设计一个C语言程序,求解方程组的,急啊,哪位高手帮下咯,万分感谢

如题所述

假定你要的是线性方程组,下面的
float *GauseSeidel(float *a,int n)
是高斯赛德尔法求解线性方程组的通用子程序。
N 是 迭代次数极限。

main()里写了调用的例子。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100
float *GauseSeidel(float *a,int n)
{
int i,j,nu=0;
float *x,dx;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
x[i]=0.0;
do {
for(i=0;i<=n-1;i++) {
float d=0.0;
for(j=0;j<=n-1;j++)
d+=*(a+i*(n+1)+j)*x[j];
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
x[i]+=dx;
}
if(nu>=N)
{
printf("iter divergence\n");
exit(1);
}
nu++;
}
while(fabs(dx)>1e-6);
return x;
}
void main()
{
int i;
float *x;
float c[12]={5,2,1,8,2,8,-3,21,1,-3,-6,1};
float *GauseSeidel(float *,int);
x=GauseSeidel(c,3);
for(i=0;i<=2;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-04-25
解方程组有好几种方法:
一:高斯消去法,
程序段:
#define N 3
#include <iostream.h>
#include <math.h>
void main()
{
double a[N][N+1] = {0.101,2.304,3.555,1.183,
-1.347,3.712,4.623,2.137,
-2.835,1.072,5.643,3.035}; //增广矩阵
double x[N]; //存储解向量
double m; // 中间变量
int i, j, k;

//消元过程
for(k=0;k<N-1;k++){ // k<N-1 ?
if(a[k][k]==0) {
cout << "求解失败!";
break;
}
for(i=k+1;i<N;i++){
m = a[i][k] / a[k][k];
a[i][k] = 0;
for(j=k+1;j<=N;j++) // j<=N?
a[i][j] = a[i][j] - a[k][j] * m;
}
}
// 回代过程
x[N-1] = a[N-1][N] / a[N-1][N-1];
for(k=N-2;k>=0;k--){
for(j=k+1;j<N;j++){
a[k][N] = a[k][N] - a[k][j] * x[j];
}
x[k] = a[k][N] / a[k][k];
}
// 输出结果
for(k=0;k<N;k++)
cout << x[k]<<endl;
}
二:列主元高斯消去算法,
程序段:
#define N 3
#include <iostream.h>
#include <math.h>
void main()
{
double a[N][N+1] = {0.101,2.304,3.555,1.183,
-1.347,3.712,4.623,2.137,
-2.835,1.072,5.643,3.035}; //增广矩阵
double x[N]; //存储解向量
double m; // 中间变量
int i, j, k,s;

//消元过程
for(k=0;k<N-1;k++)
{ // k<N-1 ?
s=k;
for(i=k+1;i<N;i++)
{
if(fabs(a[s][k])<fabs(a[i][k]))
s=i;
}
if(s!=k)
{
for(j=0;j<=N;j++)
{
m=a[k][j];
a[k][j]=a[s][j];
a[s][j]=m;
}
}
if(a[k][k]==0)
{
cout << "求解失败!";
break;
}
for(i=k+1;i<N;i++)
{
m = a[i][k] / a[k][k];
a[i][k] = 0;
for(j=k+1;j<=N;j++) // j<=N?
a[i][j] = a[i][j] - a[k][j] * m;
}
}
// 回代过程
x[N-1] = a[N-1][N] / a[N-1][N-1];
for(k=N-2;k>=0;k--)
{
for(j=k+1;j<N;j++)
{
a[k][N] = a[k][N] - a[k][j] * x[j];
}
x[k] = a[k][N] / a[k][k];
}
// 输出结果
for(k=0;k<N;k++)
cout << x[k]<<endl;
}
三:顺序高斯消去算法相对应的LU分解方法:
程序段:
#include <iostream.h>
#include <math.h>
#define N 4

void main()
{
double a[N][N]={0.3e-15,59.14,3,1,
5.291,-6.13,-1,2,
11.2,9,5,2,
1,2,1,1 }; //存储矩阵A
double x[N],b[N]={59.17,46.78,1,2};
int i,j,k;
//****** 开始LU分解 *************
for(k=0;k<N-1;k++)
{
if(a[k][k]==0)
{
cout << "主元素为零!" << endl;
break;
}
for(i=k+1;i<N;i++)
{
a[i][k] = a[i][k] / a[k][k]; // 矩阵A的严格下三角部分存储L矩阵的严格下三角部分
for(j=k+1;j<N;j++)
{
a[i][j] = a[i][j] - a[i][k] * a[k][j];
} //计算U矩阵
}
}
//********* LU 分解完成 **************
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout << a[i][j] << " ";
}
cout << endl;
} // 输出 LU 分解
x[0]=b[0];
for(k=1;k<N;k++)
{
for(j=0;j<k;j++)
{
b[k]=b[k]-a[k][j]*x[j];
}
x[k]=b[k];
}
x[N-1]=x[N-1]/a[N-1][N-1];
for(k=N-2;k>=0;k--)
{
for(j=k+1;j<N;j++)
{
x[k] = x[k] - a[k][j] * x[j];
}
x[k] = x[k] / a[k][k];
}
for(k=0;k<N;k++)
cout << x[k]<<endl;

}
四:列主元高斯消去算法所对应的LU分解方法:
程序段:
#include <iostream.h>
#include <math.h>
#define N 4

void main()
{
double a[N][N]={0.3e-15,59.14,3,1,
5.291,-6.13,-1,2,
11.2,9,5,2,
1,2,1,1 }; //存储矩阵A
double x[N],b[N]={59.17,46.78,1,2};
int p[N]; // 记录分解过程中的行交换!
int i,j,k;

for(k=0;k<N;k++)
p[k] = k+1; // 初始化,相当于单位阵
//****** 开始LU分解 *************
for(k=0;k<N-1;k++)
{
int s,t; //s存储当前列绝对值最大的元素所在的行号,t为中间变量
s=k;
for(i=k+1;i<N;i++)
{
if(fabs(a[i][k])>fabs(a[s][k]))
s=i;
} // 选主元素
if(s!=k)
{
double m;
for(j=0;j<N;j++)// 注意这里要交换k、s两行所有的元素
{
m = a[k][j];
a[k][j] = a[s][j];
a[s][j] = m;
} // 交换行
t= p[s];
p[s] = p[k];
p[k] = t; //记录当前行交换
}

if(a[k][k]==0)
{
cout << "存在为零的主元素!" << endl;
continue;
}// 判定主元素为零,矩阵奇异,方程组解不唯一

for(i=k+1;i<N;i++)
{
a[i][k] = a[i][k] / a[k][k]; // 矩阵A的严格下三角部分存储L矩阵的严格下三角部分
for(j=k+1;j<N;j++)
{
a[i][j] = a[i][j] - a[i][k] * a[k][j];
} //计算U矩阵
}
}
//********* LU 分解完成 **************
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout << a[i][j] << " ";
}
cout << endl;
} // 输出 LU 分解
x[0]=b[0];
for(k=1;k<N;k++)
{
for(j=0;j<k;j++)
{
b[k]=b[k]-a[k][j]*x[j];
}
x[k]=b[k];
}
x[N-1]=x[N-1]/a[N-1][N-1];
for(k=N-2;k>=0;k--)
{
for(j=k+1;j<N;j++)
{
x[k] = x[k] - a[k][j] * x[j];
}
x[k] = x[k] / a[k][k];
}
for(k=0;k<N;k++)
cout << x[k]<<endl;
}
还有一些迭代法;
一:雅可比迭代
#define N 4 // 线性方程组的阶数
#include <iostream.h>
#include <math.h>
void main()
{
double a[N][N]={-4,1,1,1,1,-4,1,1,1,1,-4,1,1,1,1,-4}, //系数矩阵
b[N]={1,1,1,1}; //右端常数向量
double x0[N]={1,1,1,1},x[N]; // 迭代初始向量和迭代向量
double e=1e-5; // 精度要求
int M=5000; //最大迭代次数
int i,j,c_M=0;
double sum,current_e;

do{
current_e=0;
for(i=0;i<N;i++)
{
sum = 0;
for(j=0;j<N;j++)
{
if(j!=i)
{
sum = sum + a[i][j] * x0[j];
}
}
x[i] = (b[i] - sum) / a[i][i];
}// 更新迭代向量

c_M++; //迭代次数加1
for(i=0;i<N;i++)
{
if(fabs(x[i]-x0[i])>current_e)
current_e = fabs(x[i]-x0[i]);
} //计算当前误差
for(i=0;i<N;i++)
x0[i] = x[i]; //更新初始向量
}while(current_e>e&&c_M<M); //判断是否仍未达到精度要求且未达到最大迭代次数

for(i=0;i<N;i++)
cout << x[i] << endl; //输出结果
cout << c_M << endl; //输出迭代次数
}
二:高斯-塞德尔(Gauss-Seidel)迭代算法
程序
#define N 3 // 线性方程组的阶数
#include <iostream.h>
#include <math.h>
void main()
{
double a[N][N]={5,2,1,
2,8,-3,
1,-3,-6}, //系数矩阵
b[N]={8,21,1}; //右端常数向量
double x0[N]={1,1,1},x[N]; // 迭代初始向量和迭代向量
double e=1e-5; // 精度要求
int M=5000; //最大迭代次数
int i,j,c_M=0;
double sum,current_e;

do{
current_e=0;
for(i=0;i<N;i++)
{
sum = 0;
for(j=0;j<N;j++)
{
if(j<i)
{
sum = sum + a[i][j] * x[j];
}
if(j>i)
{
sum = sum + a[i][j] * x0[j];
}
}
x[i] = (b[i] - sum) / a[i][i];
}// 更新迭代向量

c_M++; //迭代次数加1
for(i=0;i<N;i++)
{
if(fabs(x[i]-x0[i])>current_e)
current_e = fabs(x[i]-x0[i]);
} //计算当前误差
for(i=0;i<N;i++)
x0[i] = x[i]; //更新初始向量
}while(current_e>e&&c_M<M); //判断是否仍未达到精度要求且未达到最大迭代次数

for(i=0;i<N;i++)
cout << x[i] << endl; //输出结果
cout << c_M << endl; //输出迭代次数
}
三:SOR迭代算法
程序
#define N 4 // 线性方程组的阶数
#include <iostream.h>
#include <math.h>
void main()
{
double a[N][N]={-4,1,1,1,
1,-4,1,1,
1,1,-4,1,
1,1,1,-4}, //系数矩阵
b[N]={1,1,1,1}; //右端常数向量
double x0[N]={1,1,1,1},x[N]; // 迭代初始向量和迭代向量
double e=1e-5,w=0.5; // 精度要求
int M=5000; //最大迭代次数
int i,j,c_M=0;
double sum,current_e;

do{
current_e=0;
for(i=0;i<N;i++)
{
sum = 0;
for(j=0;j<N;j++)
{
if(j<i)
{
sum = sum + a[i][j] * x[j];
}
if(j>i)
{
sum = sum + a[i][j] * x0[j];
}

}
x[i] = (1-w)*x0[i] + w*(b[i] - sum) / a[i][i];
}// 更新迭代向量

c_M++; //迭代次数加1
for(i=0;i<N;i++)
{
if(fabs(x[i]-x0[i])>current_e)
current_e = fabs(x[i]-x0[i]);
} //计算当前误差
for(i=0;i<N;i++)
x0[i] = x[i]; //更新初始向量
}while(current_e>e&&c_M<M); //判断是否仍未达到精度要求且未达到最大迭代次数

for(i=0;i<N;i++)
cout << x[i] << endl; //输出结果
cout << c_M << endl; //输出迭代次数
}

谁能帮我设计一个C语言程序,求解方程组的,急啊,哪位高手帮下咯,万分感...
假定你要的是线性方程组,下面的 float *GauseSeidel(float *a,int n)是高斯赛德尔法求解线性方程组的通用子程序。N 是 迭代次数极限。main()里写了调用的例子。include <stdio.h> include <stdlib.h> include <math.h> define N 100 float *GauseSeidel(float *a,int n){ int i,j,nu=0;...

请教高手编写一个简单的C语言程序
int strtoint(char *str, int *r){ int len,i;int status=0;len = 0;while ( 1==1){ if (str[len] == 0) break;len = len + 1;} if (len > 6 || len <= 0) {status = 1; return status;};if (str[0] != '-' && (str[0] > '9' || str[0] < '0')...

刚刚学习C语言,各位高手帮帮写写.万分感谢。 1、写两个表达式,分别取整 ...
void main(){ int x,a,b;scanf("%d",&x);a=x%10;b=x%100\/10;printf("各位数a=%d 十位数b=%d\\n",a,b);}

求高手帮我做一个c语言程序,带解释说明,要答辩的,好的还可以继续追加...
求高手帮我做一个c语言程序,带解释说明,要答辩的,好的还可以继续追加。可以扩展更多功能,那个管理系统 100 课程报告任务书题目图书信息管理系统主要内容开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充... 课程报告任务书题 目 图...

C语言编写一个算术运算测试程序。要求完成10以内的加减运算。这个程序...
int main(){ int n,f;int a,b,c,t;int s=1;while(s==1){ t=1,f=0;\/**提示用户输入*\/ printf("欢迎进入小学算数测试系统。。请输入你要挑战的题量:");scanf("%d",&n);int q=n;\/**以时间做种子*\/ srand((unsigned)time(NULL));\/\/题数都问了就结束 while(n!=0){ printf...

...的点数决定双方的输赢。求高手帮忙 跪求 万分感谢
include int judge(int *A,int *B) \/\/A的大返回1,B的大返回2,一样大返回0 { if((A[0]==A[1])&&(B[0]==B[1])){ if(A[0]>B[0]) return 1;else if(A[0]==B[0]) return 0;else return 2;} else if((A[0]==A[1])&&(B[0]!=B[1])){ return 1;} else...

二级C语言题目求解题过程 为什么结果等于6 还望高手详细说一下 谢谢
因为m*=i*j 即m=m*i*j 只运行i=1,j分别等于3,2,1的时候

求C语言高手为我编一个程序送给女友(其他语言也可以)
"I still love you!");system("pause");} 这个是用Dev c++编的...汉字的问题完全省略啊,全是英文 嗯,我不确定这个是对的因为我也刚入门一段时间可能有点毛糙啊 而且我自己没有上机调试过,不过既然你也学了C就可以自己纠错了...= = 那么就作为一个参考如何?反正我没有登陆......

用C语言编译一个简单计算器的程序,要求其中有括号和幂函数
要是只想结果取整,将所有double类型改为int即可,不过不主张这样做,既然是计算器,当然要精确计算。一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。include <stdio.h> include <stdlib.h> include <math.h> include <string.h> char s[201];\/*全局变量s[]与i分别表示算术表达式字符...

一道C++程序,高手帮忙看一下!万分感谢!送10分以表感谢!
k++){ j++;if(k>30) k=1;} while(a[k]!=0){ k++;if(k>30) k=1;} a[k++]=1;if(k>30) k=1;\/\/n++;} 这是程序内核所在,循环15次每次剔除一人,for(j=1;a[k]==0&&j<9;k++)循环中又把第九个数赋为1表示剔除,if(k>30) k=1; 保证人数在30内循环!由此可得!

相似回答