最近用到了松弛法解方称,为加深记忆,就记录下来
/************************************************************************/
/* 松弛法解方程 */
/************************************************************************/
#include <iostream>
#include <math.h>
using namespace std;
const float w = 1.4 ;
double x[4] = {0} ;
double d = 0 ;
double SOR(double a[][4] , double b[4])
{
int q = 0 , i ;
double c[4] = {0} ;
double x[4] = {0} ;
double t[4] = {0} ;
while (1)
{
q++ ;
t[0] = (1 - w)*x[0] + w*(b[0] - a[0][1]*x[1] - a[0][2]*x[2] - a[0][3]*x[3])/a[0][0] ;
t[1] = (1 - w)*x[1] + w*(b[1] - a[1][0]*t[0] - a[1][2]*x[2] -a[1][3]*x[3])/a[1][1] ;
t[2] = (1 - w)*x[2] + w*(b[2] - a[2][0]*t[0] - a[2][1]*t[1] - a[2][3]*x[3])/a[2][2] ; t[3] = (1 - w)*x[3] + w*(b[3] - a[3][0]*t[0] - a[3][1]*t[1] - a[3][2]*t[2])/a[3][3] ;
for (int i = 0 ; i < 4 ; i++)
{
c[i] = fabs(t[i] - x[i]) ;
}
d = c[0] ;
for (i = 1 ; i < 4 ; i++)
{
if (d < c[i])
{
d = c[i] ;
}
}
for (i = 0 ; i < 4 ; i++)
{
x[i] = t[i] ;
}
if (d < 0.00001)
{
cout<<"迭代次数为:"<<q<<endl ;
for (int i = 0 ; i < 4 ; i++)
{
cout<<x[i]<<"\t" ;
}
break;
}
}
return 0 ;
}
void main()
{
int n ;
double A[4][4] = {5 , 1 , -1 , -2 , 2, 8 , 1 , 3 , 1 , -2 , -4 , -1 , -1 , 3 , 2 , 7} ;
double b[4] = {-2 , -6 , 6 , 12} ;
double c[4] = {0} ;
double x[4] = {0} ;
double m[4] = {0} ;
double t[4] = {0} ;
SOR(A , b) ;
}