#include <cmath>
using namespace std
float *one_array_malloc(int n) //一维数组分配
float **two_array_malloc(int m,int n) //二维数组分配
float matrix_category(float* x,int n)
int main()
{
const int MAX=100//最大迭代次数
int n,i,j,k
float** a
float* x_0 //初始向量
float* x_k //迭代运滑罩向量
float precision //精度
float w //松弛因子
cout<<"输入精度e:"
cin>>precision
cout<<endl<<"输入系数矩阵的阶数,N:"
cin>>旁闹n
a=two_array_malloc(n,n+1)
cout<<endl<<"输入增广矩阵的各值:\n"
for(i=0i<ni++)
{
for(j=0j<n+1j++)
{
cin>>a[i][j]
}
}
x_0=one_array_malloc(n)
cout<<endl<<"输入初始向量:\n"
for(i=0i<ni++)
{
cin>>x_0[i]
}
x_k=one_array_malloc(n)
cout<<"输入松弛因子w (1<w<2):\n"
cin>>w
float temp
//迭代过程
for(k=0k<MAXk++)
{
for(i=0i<ni++)
{
temp=0
for(j=0j<ij++)
{
temp=temp+a[i][j]*x_k[j]
}
x_k[i]=a[i][n]-temp
temp=0
for(j=i+1j<nj++)
{
temp=temp+a[i][j]*x_0[j]
}
x_k[i]=(x_k[i]-temp)/a[i][i]
x_k[i]=(1-w)*x_0[i]+w*x_k[i]
}
//求两解向量的差的范数
for(i=0i<ni++)
{
x_0[i]=x_k[i]-x_0[i]
}
if(matrix_category(x_0,n)<precision)
{
break
}
else
{
for(i=0i<ni++)
{
x_0[i]=x_k[i]
}
}
}
//输出过程
if(MAX==k)
{
cout<<"迭代不收敛\n"
}
cout<<"迭代次数为:"<<k<<endl
cout<<"解向量为:\n"
for(i=0i<ni++)
{
cout<<"x"<<i<<": "<<x_k[i]<<endl
}
return 0
}
float *one_array_malloc(int n) //一维数组分配
{
float *a
a=(float *)malloc(sizeof(float)*n)
return a
}
float **two_array_malloc(int m,int n) //二维数组分配
{
float **a
int i
a=(float **)malloc(m*sizeof(float *))
for (i=0i<mi++)
{
a[i]=(float *)malloc(n*sizeof(float))
}
return a
}
float matrix_category(float* x,int n)
{
int i
float temp=0
for(i=0i<让孙ni++)
{
temp=temp+fabs(x[i])
}
return temp
}
c++的,自己改改吧
#include<iostream.h>#include<math.h>#include<iomanip.h>Void main(){double u1[5][5],u2[5][5]int flag=1000,i,j,e,n
double a,d//a最佳加速收敛因子
for(i=0i<5i++)for(j=0j<5j++)
{if(i==0)u1[i][j]=100else u1[i][j]=0}
cout<<"迭代前各电位点上的初始值:"<<endl
for(i=0i<5i++)
{for(j=0j<5j++){cout<滚锋<u1[i][j]<<" "//输出迭代初值}cout<<endl }cout<<"\n"
for(d=1d<2d+=0.01)//找取迭代次数最少的加速收敛因子 {n=0for(j=0j<5j++)
{u1[0][j]=100}
for(i=1i<5i++)for(j=0j<5j++) {u1[i][j]=0}do//迭代x次 {for(i=0i<5i++) {for(j=0j<5j++) {u2[i][j]=u1[i][j]}}
for(i=1i<4i++)for(j=1j<大腔晌4j++)
{u1[i][j]=u2[i][j]+(d/4)*(u2[i+1][j]+u2[i][j+1]+u1[i-1][j]+u1[i][j-1]-4*u2[i][j])} for(i=1i<4i++)//判断精度 {{for(j=1j<4j++)
{if(fabs(u1[i][j]-u2[i][j])>1e-5)
{e=1break}
else e=0}
if(e==1) break}} n++//迭代次数}while(e) if(n<flag) {flag=na=d}}
cout<<"收敛因子:"<<a<<圆弊endl
cout<<endl
cout<<"迭代次数:"<<flag<<endl cout<<endl
cout<<"各节点上最终电位近似值:"<<endl for(i=0i<5i++) {for(j=0j<5j++)
{cout<<setiosflags(ios::fixed)<<setprecision(5)<<setw(8)<<u1[i][j]<<" "//对齐输出} cout<<endl}
cout<<endl}
超松弛迭代法的分量表达式如下:
M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度,omiga是松弛因子。
D. M. Young于20世纪70年代提出逐次超松弛(Successive Over Relaxation)迭代法,简称SOR方法,是一种经典的迭代算法。它是为了解决大规模系统的线性等式提出来的,在GS法基础上为提高收敛速度,采用加权平均而得到的新算法。
由于超松弛迭代法公滑槐式简单,编码让差制程序容易,很多工程学、计算数学中都会应用超松弛迭代方法。使用超松弛迭代法的关键在于选取合适的松弛因子,如果松弛因子选取合适,则会大大缩短计算时间。
为解决实际问题中大维数线性代数方程组的求解问题,提出了许多迭代法。但大多数迭代法不是对各类线性方程组都有收敛性。在解题时,对原方程组矩阵作一根本的变换,从而可能使条件数变坏,也可能破坏了变换前后方程组的等价性,以及丧失使原方程组的对称性等。通过对GS法进行改进,从而产生了逐次超松弛(SOR)迭代法。
SOR方法的思路为:如果能够简单有效地确定单个样本加入样本集后对训练结果的影响,一方面,出现新的样本时可以利用原来的一训练迟皮结果而不必重新开始;另一方面,让训练样本逐个进入样本集可以简化寻优过程,提高算法速度。这实际上是将样本集中的样本数减少到一个。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)