int main()
{
double x[4] = {0, 0, 0, 0}
double a[4][4] = {1, 2, 4, 8, 1, 3, 9, 27, 1, 4, 16, 64, 1, 5, 25, 125}
double y[4] = {10, 26, 58, 112}
double d[4][4], g[4]
int round = 5, i,j
for (i=0i<4++i) {
g[i] = y[i] / a[i][i]
for (j=0j<4++j) {
d[i][j] = i==j ? 0 : -a[i][j]/a[i][i]
}
}
while (round--) {
for (i=0i<4++i) {
x[i] = g[i]
for (j=0j<4++j) {
x[i] += d[i][j] * x[j]
}
printf("%lf " , x[i])
}
printf("\n")
}
}
#include<iostream>#include<cmath>
using namespace std
#define N 3
long double a[N][N]
long double b[N]
long double eps
long double x[N]//声明系数矩阵,方程右侧值,相对误差分析,解的初始值
void GetData() //获得数据
void Gauss_Seidel() //高斯迭代
void Show() //输出结果
int main()
{
cout<<"======================================="<<endl
cout<<" gauss_seidel迭代法解方程组"<<endl
cout<<"======================================="<<endl
GetData()
Gauss_Seidel()
Show()
return 0
}
void GetData()
{
for(int i=0i<3i++)
{
cout<<"系数矩阵第"<<i+1<<"行:"
for(int j=0j<3j++) cin>>a[i][j]
}
cout<<"方程右侧值:"
cin>>b[0]>>b[1]>>b[2]
cout<<"误差允许量:"
cin>>eps
cout<<"解的初始值:"
cin>>x[0]>>x[1]>>x[2]
}
void Gauss_Seidel()
{
int flagdouble xold,sum,error
do
{
flag=0
for(int i=0i<3i++)
{
xold=x[i]
sum=0.0
for(int j=0j<3j++)
if(j!=i) sum+=a[i][j]*x[j]
x[i]=(b[i]-sum)/a[i][i]
error=fabs(xold-x[i])/x[i]
if(error>=eps) flag=1
}
}while(flag==1)
}
void Show()
{
cout<<"结果是:"<<endl
for(int i=0i<3i++)
cout<<"x"<<i+1<<" "<<x[i]<<endl
}
你可以看看我的思路,但是这道题数字问题,在我的电脑上运行时总是过界,简单的数字还可以,不好意思
N元通用程序,用四元调用.四元方程组:a[4][5]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0}
高斯消元法(通用程序):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float *ColPivot(float *c,int n)
void main()
{
int i,j
float *x
int n=4
float a[4][5]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0}
x=ColPivot(a[0],n)
for (i=0i<ni++) printf("x[%d]=%f\n",i,x[i])
getch()
}
float *ColPivot(float *c,int n)
{
int i,j,t,k
float *x,p
x=(float *)malloc(n*sizeof(float))
for(i=0i<=n-2i++)
{
k=i
for(j=i+1j<=n-1j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j
if(k!=i)
for(j=ij<=nj++)
{
p=*(c+i*(n+1)+j)
*(c+i*(n+1)+j)=*(c+k*(n+1)+j)
*(c+k*(n+1)+j)=p
}
for(j=i+1j<=n-1j++)
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i))
for(t=it<=nt++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t))
}
}
for(i=n-1i>=0i--)
{
for(j=n-1j>=i+1j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j))
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i))
}
return x
}
-------------------------------------------
高斯赛德尔迭代法(通用程序):
#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=0i<=n-1i++)
x[i]=0.0
do {
for(i=0i<=n-1i++) {
float d=0.0
for(j=0j<=n-1j++)
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[20]={4.,-1.,0.,2.,-1.0,-1,4,-1,0,-7.0,0,-1,4,-1,9.0,2,0,-1,4.0,0.0}
float *GauseSeidel(float *,int)
x=GauseSeidel(c,4)
for(i=0i<=3i++)
printf("x[%d]=%f\n",i,x[i])
getch()
}