C语言高斯-塞德尔迭代法

Python014

C语言高斯-塞德尔迭代法,第1张

#include <stdio.h>

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()

}