求超松弛迭代法c程序

求超松弛迭代法c程序,第1张

#include <iostream>

#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方法的思路为:如果能够简单有效地确定单个样本加入样本集后对训练结果的影响,一方面,出现新的样本时可以利用原来的一训练迟皮结果而不必重新开始;另一方面,让训练样本逐个进入样本集可以简化寻优过程,提高算法速度。这实际上是将样本集中的样本数减少到一个。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12380074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存