超松弛法(C++ 数值分析)

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
const int n=4;
const double w=1.15;                       //w不能定义为float类型
int main()
{
 float a[n][n],b[n];
 int i,j;
    void gauss(float a[][n],float b[n]);          //声明
 cout<<"please input a[i][j]:"<<endl;
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   cin>>a[i][j];
 cout<<endl;
 cout<<"please input b[i]:"<<endl;
 for(i=0;i<n;i++)
  cin>>b[i];
 cout<<'/n';
 gauss(a,b);                                   //调用
 return 0;
}


void gauss(float a[][n],float b[n])                //求解
{
 int i,k=0;
    float max_cha(float x1[n],float x2[n]);
    float qiu_he1(float a[][n],float x1[n],int i);
    float qiu_he2(float a[][n],float x2[n],int i);
 float cha,he1,he2;
 float x1[n],x2[n];
    cout<<setiosflags(ios::right);
 for(i=0;i<=n;i++)
 {
  if(i==0)
   cout<<setw(10)<<"k";
        else
   cout<<setw(14)<<"x"<<i;
 }
 cout<<'/n'<<setw(10)<<k;
 for(i=0;i<n;i++)
 {
  x1[i]=0;
  cout<<setiosflags(ios::right);
  cout<<setw(15)<<x1[i];
 }
 cout<<endl;
    do
 {k++;
  cout<<setw(10)<<k;
  for(i=0;i<n;i++)
  {
   he1=qiu_he1(a,x1,i);
            he2=qiu_he2(a,x2,i);
      x2[i]=x1[i]+w/a[i][i]*(b[i]-he2-he1);
   cout<<setw(15)<<x2[i];
  }
  cout<<endl;
  cha=max_cha(x1,x2);
  for(i=0;i<n;i++)
   x1[i]=x2[i];
 }
 while(fabs(cha)>0.00001);
 cout<<endl;
}

 

float qiu_he1(float a[][n],float x1[n],int i)
{
 float sum=0;
 int j;
 for(j=i;j<n;j++)
  sum+=a[i][j]*x1[j];
 return (sum);
}

 

float qiu_he2(float a[][n],float x2[n],int i)
{
 float sum=0;
 int j;
 for(j=0;j<i;j++)
  sum+=a[i][j]*x2[j];
 return (sum);
}

 

float max_cha(float x1[n],float x2[n])
{
 int j;
 float max=fabs(x1[0]-x2[0]);
 float cha;
 for(j=0;j<n;j++)
 {
        cha=fabs(x1[j]-x2[j]);
  if(max<cha)
   max=cha;
 }
 return (max);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值