//数值计算程序-特征值和特征向量
创新互联公司专注于毕节企业网站建设,响应式网站设计,成都做商城网站。毕节网站建设公司,为毕节等地区提供建站服务。全流程按需定制,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
//////////////////////////////////////////////////////////////
//约化对称矩阵为三对角对称矩阵
//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵
//a-长度为n*n的数组,存放n阶实对称矩阵
//n-矩阵的阶数
//q-长度为n*n的数组,返回时存放Householder变换矩阵
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
void eastrq(double a[],int n,double q[],double b[],double c[]);
//////////////////////////////////////////////////////////////
//求实对称三对角对称矩阵的全部特征值及特征向量
//利用变型QR方法计算实对称三对角矩阵全部特征值及特征向量
//n-矩阵的阶数
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
//q-长度为n*n的数组,若存放单位矩阵,则返回实对称三对角矩阵的特征向量组
// 若存放Householder变换矩阵,则返回实对称矩阵A的特征向量组
//a-长度为n*n的数组,存放n阶实对称矩阵
int ebstq(int n,double b[],double c[],double q[],double eps,int l);
//////////////////////////////////////////////////////////////
//约化实矩阵为赫申伯格(Hessen berg)矩阵
//利用初等相似变换将n阶实矩阵约化为上H矩阵
//a-长度为n*n的数组,存放n阶实矩阵,返回时存放上H矩阵
//n-矩阵的阶数
void echbg(double a[],int n);
//////////////////////////////////////////////////////////////
//求赫申伯格(Hessen berg)矩阵的全部特征值
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//利用带原点位移的双重步QR方法求上H矩阵的全部特征值
//a-长度为n*n的数组,存放上H矩阵
//n-矩阵的阶数
//u-长度为n的数组,返回n个特征值的实部
//v-长度为n的数组,返回n个特征值的虚部
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int edqr(double a[],int n,double u[],double v[],double eps,int jt);
//////////////////////////////////////////////////////////////
//求实对称矩阵的特征值及特征向量的雅格比法
//利用雅格比(Jacobi)方法求实对称矩阵的全部特征值及特征向量
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//a-长度为n*n的数组,存放实对称矩阵,返回时对角线存放n个特征值
//n-矩阵的阶数
//u-长度为n*n的数组,返回特征向量(按列存储)
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int eejcb(double a[],int n,double v[],double eps,int jt);
//////////////////////////////////////////////////////////////
选自徐世良数值计算程序集(C)
每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。
今天都给贴出来了
#include "stdio.h"
#include "math.h"
//约化对称矩阵为三对角对称矩阵
//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵
//a-长度为n*n的数组,存放n阶实对称矩阵
//n-矩阵的阶数
//q-长度为n*n的数组,返回时存放Householder变换矩阵
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
#includestdio.h
void matrix(int a[][100],int a1,int a2,int b[][100],int b1,int b2,int c[][100])
{
int i,j,k;
if(a2!=b1)
{
printf("矩阵的维数错了!\n");
return;
}
for(i=0;ia1;i++)
{
for(j=0;jb2;j++)
{
c[i][j]=0;
for(k=0;ka2;k++)
c[i][j]+=a[i][k]*b[k][j];
}
}
}
int main()
{
int a1,a2,b1,b2,a[100][100],b[100][100],c[100][100],i,j;
printf("输入矩阵一的行数和列数(不超过100):\n");
scanf("%d%d",a1,a2);
for(i=0;ia1;i++)
{
for(j=0;ja2;j++)
scanf("%d",a[i][j]);
}
printf("输入矩阵一的行数和列数(不超过100):\n");
scanf("%d%d",b1,b2);
for(i=0;ib1;i++)
{
for(j=0;jb2;j++)
scanf("%d",b[i][j]);
}
matrix(a,a1,a2,b,b1,b2,c);
printf("结果:\n");
for(i=0;ia1;i++)
{
for(j=0;jb2;j++)
printf("%d ",c[i][j]);
printf("\n");
}
return 0;
}
根据叉乘的计算方法可知
因此可直接通过计算三阶行列式的方法来计算两向量的叉乘
#includestdio.h
void cp()
{
double a,b,c,d,e,f,x,y,z;
printf("请输入向量a:");
scanf("%lf %lf %lf",a,b,c);
printf("请输入向量b:");
scanf("%lf %lf %lf",d,e,f);
x=b*f-c*e;//计算三阶行列式
y=c*d-a*f;
z=a*e-b*d;
printf("aXb=(%lf %lf %lf)\n",x,y,z);/
}
int main()
{
cp();
return 0;
}
运行结果如下:
#include"stdio.h"
main()
{
int i,j,a[3][1],b[1][3],c[3][3];//定义三个矩阵
printf("请输入矩阵a[3][1]:\n");
for(i=0;i3;i++)
scanf("%d",a[i][0]);//输入3*1矩阵
printf("请输入矩阵b[1][3]:\n");
for(i=0;i3;i++)
scanf("%d",b[0][i]);//输入1*3矩阵
for(i=0;i3;i++)
for(j=0;j3;j++)
c[i][j]=a[i][0]*b[0][j];//计算2个矩阵的叉乘,并存入c[3][3]
printf("a[3][1]*b[1][3]的结果是:\n");
for(i=0;i3;i++)
{
for(j=0;j3;j++)
printf("%6d ",c[i][j]);//输出结果
printf("\n");
}
getchar();
getchar();
getchar();
}