- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE \* MERGEFORMAT10
数值分析大作业一
算法设计方案
由于算法要求所有零元素都不存储,因此采用带状矩阵来存储矩阵,主要子程序为LU分解子程序、求解方程组子程序、带偏移量幂法求特征值子程序、带偏移量反幂法求特征值子程序具体算法设计思路如下:
①利用幂法求按模最大的特征值
②使用带原点平移的幂法求的按模最大的特征值,则为另外一特征值
③比较与的大小,较大值即为,较小者即为
④使用反幂法求的按模最小的特征值,利用LU分解求取每一次迭代后的
⑤使用带偏移量的反幂法,偏移量分别为,即可求得分别与之相距最近的特征值
⑥为非奇异的是对称矩阵,因此,其中和分别为按模最大的特征值和按模最小的特征值
⑦本题中LU分解采用doolittle方法,分解后所得矩阵即为对A进行初等行列式变换后所得矩阵,切变换过程中行列式值不变,因此
源程序
#include math.h
#include stdio.h
#include stdlib.h
#define N 501 //矩阵为501*501的矩阵
#define s 2 //上半带宽
#define r 2 //下半带宽 3个宏定义为方便LU分解及求解方程组过程
/**********全局变量定义**********************/
double A[5][501];
double u[501],y[501];
double lambda[41];//lambda[0]为λ1及最小特征值,lambda[40]为λ501及最大特征值
double lambda_s,lambda_m; //按模最小(大)的特征值;
double LU[5][501];
/********子函数声明**************************/
void init_A(double A[][501]); //初始化A矩阵
double module_value_u(double tt[]); //求u[501]的模值
void init_u(double tt[]); //初始化迭代初始向量u0
double power_method(double offset);//带原点偏移的幂法,返回值为特征值
double inverse_power_method(double offset);//带原点偏移的反幂法,返回值为特征值,子函数中打印出偏移量,求得的特征值,误差,迭代次数
void LU_decomposition(double c[][501]); //参数c为矩阵LU[5][501]首地址,程序进行完后,保存分解后的L和U缩减后的矩阵
void solve(double c[][501],double b[],double x[]); ////第1个参数为LU分解完的LU矩阵,第2个参数b为已知的右端值,第3个参数x为求得的解向量存储位置
int max_2(int a,int b);
int max_3(int a,int b,int c);
int min_2(int a,int b);
void main() //主程序
{
int i;
double uk; //偏移量
double det; //A的行列式的值
init_A(A); //初始化矩阵A
lambda_m=power_method(0); //求按模最大的特征值
lambda[40]=power_method(lambda_m); //求相反方向另一个端点的特征值
if(lambda_mlambda[40]) //若大小反向,则交换两个元素中的值,得到λ1和λ501
{
lambda[0]=lambda[40];
lambda[40]=lambda_m;
}
else
{
lambda[0]=lambda_m;
}
lambda_s=inverse_power_method(0);
det=1;
for(i=0;iN;i++)
det=det*LU[s][i];
for(i=1;i40;i++)
{
uk=lambda[0]+(lambda[40]-lambda[0])*i/40;
lambda[i]=inverse_power_method(uk);
}
printf(The results are as follows\n);
printf(λ[1]=%1.11e \nλ[501]=%1.11e\n,lambda[0],lambda[40]);
printf(λs=%1.11e\n,lambda_s);
printf(co
文档评论(0)