雅克比迭代公式
公式:
代码实现:
双重循环实现迭代过程
/**
*@name Jacobi_iteration:雅克比迭代方法求解向量
*@param1 x:初始解向量x
*@param2 x1:迭代结果解向量
*@param3 error:迭代停止的精度限
**/
void Jacobi_iteration(double* x,double* x1,double error)
{
double temp=0;
double delta=100;
while(fabs(delta)>error)
{
//根据迭代公式进行计算
for (int i=0;i<2;i++)
{
//每一次利用中间变量temp存储迭代结果
temp=0;
for (int j=0;j<2;j++)
{
if(i!=j)
temp+=1/A[i][i]*(b[i]-A[i][j]*x[j]);
}
x1[i]=temp;
}
//打印这一轮的解向量,并求出误差
Print_vector(x1);
delta=Max(x1)-Max(x);
//将x1赋给x,进入新一轮迭代
for(int i=0;i<2;i++)
{
x[i]=x1[i];
}
}
}
高斯-塞德尔迭代
公式:
代码实现:
这里应该可以有两种写法,我直接将计算得到的x1[i]同时更新给了x[i],也可以直接利用公式,小于i的用向量x1,大于i的用向量x。
/**
*@name Gaussian_iteration:高斯迭代方法求解向量
*@param1 x:初始解向量x
*@param2 x1:迭代结果解向量
*@param3 error:迭代停止的精度限
**/
void Gaussian_iteration(double* x,double* x1,double error)
{
double temp=0;
double delta=100;
double max_x;
while(fabs(delta)>error)
{
max_x=Max(x);
//利用高斯迭代法进行迭代
for(int i=0;i<2;i++)
{
temp=0;
for(int j=0;j<2;j++)
{
if(i!=j)
temp+=1/A[i][i]*(b[i]-A[i][j]*x[j]);
}
x1[i]=x[i]=temp;
}
//打印这一轮迭代的解向量
Print_vector(x1);
delta=Max(x1)-max_x;
}
}
超松弛法
公式:
利用了一个松弛因子进行加速,注意0<w<2
代码实现:
/**
*@name Super_loose:超松弛迭代方法求解向量
*@param1 x:初始解向量x
*@param2 x1:迭代结果解向量
*@param3 error:迭代停止的精度限
*@param4 w;松弛因子
**/
void Super_loose(double* x,double* x1,double error,double w)
{
double temp=0;
double delta=100;
double max_x;
double temp_x[2];
while(fabs(delta)>error)
{
//将变化前的x存起来
max_x=Max(x);
for(int i=0;i<2;i++)
{
temp_x[i]=x[i];
}
//利用高斯迭代法进行迭代
for(int i=0;i<2;i++)
{
temp=0;
for(int j=0;j<2;j++)
{
if(i!=j)
temp+=1/A[i][i]*(b[i]-A[i][j]*x[j]);
}
x1[i]=x[i]=temp;
}
//超松弛加权
for(int i=0;i<2;i++)
{
x1[i]=w*x1[i]+(1-w)*temp_x[i];
}
//打印这一轮迭代的解向量
Print_vector(x1);
delta=Max(x1)-max_x;
}
}