⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 householder

📁 收集的C语言算法程序
💻
字号:
Householder变换2007-07-16 18:33#include<iostream>
#include<math.h>
using namespace std;
#define n 5               //输入一个5维的向量,n的值可更改

int sign(float x)             //定义符号函数
{
if(x<0) return -1;
else return 1;
}

void main()
{
cout<<"请输入X向量:\n";
int i,j;
double x[n],max,a=0,v[n],ww[n][n],y[n],w[n],vv=0,xx[n];
for(i=0;i<n;i++)
   cin>>x[i];
for(i=0;i<n;i++)
   xx[i]=x[i];            //为了保存x的初始值
max=fabs(x[0]);
for(i=0;i<n;i++)
{
   if(max<fabs(x[i])) max=fabs(x[i]);
}
     for(i=0;i<n;i++)
      x[i]=x[i]/max; 
for(i=0;i<n;i++)
            a+=x[i]*x[i];
     a=sqrt(a);
        a=sign(x[0])*a;
     x[0]=x[0]+a;
     for(i=0;i<n;i++)
      v[i]=x[i];
     for(i=0;i<n;i++)
      vv+=v[i]*v[i];
     vv=sqrt(vv);

        for(i=0;i<n;i++)
      w[i]=v[i]/vv;

     for(i=0;i<n;i++)
      for(j=0;j<n;j++)
       ww[i][j]=(-2)*w[i]*w[j];
   
        for(i=0;i<n;i++)
    ww[i][i]=1+ww[i][i];                   //没有按照书上的步骤求v,用v的值来算,因为计算机中开方并不复杂,也不会增加计算量

        cout<<"\nX向量的Householder变换矩阵是:\n";
     for(i=0;i<n;i++)
     {
       for(j=0;j<n;j++)
    cout<<ww[i][j]<<"   ";
       cout<<"\n";
     }
     for(i=0;i<n;i++)
     {     
      y[i]=0;
      for(j=0;j<n;j++)
       y[i]+=ww[i][j]*xx[j];         //此处应注意,要乘以x的初始值,如果直接写x[i],则得不到正确结果,因为x已经被赋其他值
     }
     cout<<"\n经过Householder变换,X向量变成了:\n";
     for(i=0;i<n;i++)
      cout<<y[i]<<" ";
        cout<<"\n";
     cout<<"\n";

}
//经过变换,显示出x的分量已经很小,则可以认为为零,比如10的负16次幂,可以认为是零
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -