实用文案
int max_iterations;//最大值迭代次数
int abs_min_iterations;//求绝对值最小的迭代次数 };
int main() {
FinalValue main_num= {0,0,0,0}; double temp;//两值交换中间变量 int temp1;
double u[501]={0};//,y[501];//为u0赋初值 double Norm_u=0;//范数 double C[5][501] = {0}; InitC(C);//初始化C int i=0,*iterations; Initu(u);
iterations = &main_num.min_iterations; main_num.min = Get_Fabs_Eigenvalue(C[2],u,iterations);//将求得的绝对值最大特征值放到min变量中
main_num.abs_max = main_num.min; A_sub_minI(C[2],main_num.min); for(i=0;i<501;i++) u[i]=i+1;
iterations = &main_num.max_iterations; main_num.max = Get_Fabs_Eigenvalue(C[2],u,iterations);//将求得的绝对值最大特征值放到min变量中
main_num.max += main_num.min; if(main_num.min>main_num.max) {
temp = main_num.min;
main_num.min = main_num.max; main_num.max = temp;
temp1 = main_num.min_iterations;
main_num.min_iterations = main_num.max_iterations; main_num.max_iterations = temp1; }
printf(\最小特征值为:%.12e,迭代次数为:%d\\n\ printf(\最大特征值为:%.12e,迭代次数为:%d\\n\ /**********************************/ /*以下利用反幂法求解模最小的特征值*/ /**********************************/ InitC(C);//初始化C Initu(u);
标准文档
实用文案
DoolittleC(C,501,2,2); main_num.detA = detA(C);
iterations = &main_num.abs_min_iterations;
main_num.abs_min = Get_min_Eigenvalue(C,u,501,2,2,iterations); main_num.cond2 = fabs(main_num.abs_max/main_num.abs_min);
printf(\绝对值最小特征值为:%.12e,迭代次数为:%d\\n\ printf(\的行列式为:%.12e;\
printf(\的条件数cond(A)2为:%.12e\\n\ /**********************************************/ /*以下利用反幂法求与数列Uk中元素最相近的特征值*/ /**********************************************/ double Uk[39];//保存Uk的值并保存与Uk[i]最接近的λ double B[39]; int diedai;
iterations = &diedai; for( i=1;i<=39;i++) {
Uk[i-1] = main_num.min + i*(main_num.max - main_num.min)/40; InitC(C); Initu(u);
for(int j =0;j<501;j++) C[2][j] -= Uk[i-1]; DoolittleC(C,501,2,2);
B[i-1] = Get_min_Eigenvalue(C,u,501,2,2,iterations); B[i-1] +=Uk[i-1];
printf(\μ%-2d=%-3.12e,与μ%-2d最相近的特征=%-3.12e\\n\ }
return 0; }
double detA(double C[5][501]) {
int i =0; double e =1;
for(i =0;i<501;i++) e*=C[2][i]; return e; }
void InitMatrix(double *p) {
标准文档
值λ实用文案
for(int i=1;i<=501;i++) {
*p=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i); p++; } }
void Initu(double *p) {
for(int i=1;i<=501;i++) {
if(i<=500) *p=0; else *p=1; p++; } // *p=1; }
void A_sub_minI(double *a,double min) {
for(int i=1;i<=501;i++) {
*a=*a-min; a++; } }
double NeiJi(double *a,double *b) {
double e=0.0;
for(int i=0;i<501;i++) {
e=e+(*a)*(*b); a++; b++; }
return e; }
void get_y(double *y,double *u) { double Norm_u=sqrt(NeiJi(u,u)); for(int i=0;i<501;i++) {
标准文档
实用文案
*y = *u/Norm_u; y++; u++; } }
void get_u(double *u,double *y,double *a) {
u[0]=a[0]*y[0]+b*y[1]+c*y[2];
u[1]=b*y[0]+a[1]*y[1]+b*y[2]+c*y[3]; for(int i=2;i<499;i++)
u[i]=c*y[i-2]+b*y[i-1]+a[i]*y[i]+b*y[i+1]+c*y[i+2]; u[499]=c*y[497]+b*y[498]+a[499]*y[499]+b*y[500]; u[500]=c*y[498]+b*y[499]+a[500]*y[500]; }
void InitC(double C[5][501]) {
int i;
for(i = 2;i < 501;i++) {
C[0][i] = -0.064; C[4][i-2] = -0.064; }
for(i = 1;i < 501;i++) {
C[1][i] = 0.16; C[3][i-1] = 0.16; }
for(i = 1;i <= 501;i++) {
C[2][i-1] = (1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i); } }
double Get_Fabs_Eigenvalue(double *a,double *u,int *iterations) {
double y[501],B_k0=0,B_k1=0; double wucha; int i=0; while(1) {
++i;
标准文档
相关推荐: