📄 type.txt
字号:
Task1源程序
//105012001057 杨舟
#include "Special.h"
#include <math.h>
#include <stdio.h>
void main ()
{
printf("作业一,用幂法与反幂法,求解矩阵的最大、最小特征值及所有特征相量\n");
printf("作者 :105012001057 杨舟\n");
printf("在生成的.txt文件中看结果\n");
SolveProblem();
}
#include<math.h>
#include<stdio.h>
#include <conio.h>
#include <process.h>
#define N 501
int Function(b,d,n,l,il,m)
int n,l,il,m;
double b[],d[];
{
int ls,k,i,j,is,u,v;
double p,t;
if(il!=2*l+1)
printf ("fail !\n");return (-2);
ls=l;
for (k=0;k<n-1;k++){
p=0.0;
for (i=k;i<=ls;i++){
t=fabs (b[i*il]);
if(t>p) p=t;is=i;
}
if(p+1.0==1.0)printf("fail!\n");return (0);
for (j=0;j<m;j++) {
u=k*m+j;v=is*m+j;
t=d[u];
d[u]=d[v];
d[v]=t;
}
for (j=0;j<il;j++){
u=k*il+j;
v=is*il+j;
t=b[u];
b[u]=b[v];
b[v]=t;
}
for (j=0;j<m;j++){
u=k*m+j;
d[u]/=b[k*il];
}
for (j=1;j<il;j++){
u=k*il+j;
b[u]/=b[k*il];
}
for (i=k+1;i<=ls;i++){
t=b[i*il];
for (j=0;j<m;j++){
u=i*m+j;
v=k*m+j;
d[u]-=t*d[v];
}
for (j=1;j<il;j++){
u=i*il+j;
v=k*il+j;
b[u-1]=b[u]-t*b[v];
}
u=i*il+il-1;
b[u]=0.0;
}
if(ls!=n-1) ls++;
}
p=b[(n-1)*il];
if (fabs(p)+1.0==1.0){
printf("fail!\n");
return(0);
}
for(j=0;j<m;j++){
u=(n-1)*m+j;
d[u]/=p;
}
ls=1;
for (i=n-2;i>=0;i--){
for (k=0;k<m;k++){
u=i*m+k;
for(j=1;j<=ls;j++){
v=i*il+j;is=(i+j)*m+k;
d[u]-=b[v]*d[is];
}
}
if(ls!=il-1) ls++;
}
return (2);
}
void SolveProblem()
{
FILE * fp;
static double s[N][5],h[N][5],a[N], b[N],c[N],d,e,f,g,MAX,MIN;
int n,m,i,j,k;
if ((fp=fopen("File1.txt","w"))==NULL){
printf("can't open file");
exit(0);
}
//利用矩阵的特殊形态采用幂法求矩阵的最大特征植及其特征向量
for (i=0;i<N;i++){
a[i]=(20.2-0.3*i)*sin(0.2*i+0.2);
b[i]=0.1;
}
for (j=0;j<2000;j++){
d=f=0;
for(k=0;k<N;k++)
d+=b[k]*b[k];
d=sqrt (d);
for (m=0;m<N;m++)
c[m]=b[m]/d;
for (n=2;n<N-2;n++)
b[n]=-c[n-2]+2*c[n-1]+c[n]*a[n]+2*c[n+1]-c[n+2];
b[0]=a[0]*c[0]+2*c[1]-c[2];
b[1]=2*c[0]+a[1]*c[1]+2*c[2]-c[3];
b[N-2]=-c[N-4]+2*c[N-3]+a[N-2]*c[N-2]+2*c[N-1];
b[N-1]=-c[N-3]+2*c[N-2]+a[N-1]*c[N-1];
for (i=0;i<N;i++)
f+=b[i]*c[i];
if(fabs((f-g)/f)<1.0e-12){
MAX=f;
break;
}
g=f;
}
for(i=0;i<N;i++){
if (c[i]<1.0e-12)
c[i]=0;
}
fprintf (fp,"最大特征值 MAX=%e \n",f);
fprintf (fp,"最大特征向量如下: \n",f);
for (i=0;i<20;i++) fprintf(fp,"Ymax[%2d]=%12e Ymax[%2d]=%12e\n",i,c[i],i+480,c[480+i]);
//采用矩阵的特殊形态利用反幂法及矩阵位移求矩阵的最小特征值及其特征向量
for(i=2;i<N;i++){
s[i][2]=(20.2-0.3*i)*sin(0.2*i+0.2);
s[i][1]=s[i][3]=2;
s[i][0]=s[i][4]=-1;
}
s[0][3]=s[0][4]=s[1][4]=s[N-2][4]=s[N-1][3]=s[N-1][4]=0;
s[0][0]=20.2*sin(0.2);
s[1][1]=19.9*sin(0.4);
s[1][0]=s[0][1]=s[1][2]=2;
s[0][2]=s[1][3]=-1;
for (i=0;i<N;i++) b[i]=1;
for (j=0;j<2000;j++) {
d=f=0;
for(k=0;k<N;k++)
d+=b[k]*b[k];
d=sqrt (d);
for(m=0;m<N;m++) {
c[m]=b[m]/d;
b[m]=c[m];
for(k=0;k<5;k++)
h[m][k]=s[m][k];
}
Function(h,b,N,2,5,1);
for (i=0;i<N;i++) f+=b[i]*c[i];
if(fabs((f-g)/f)<1.0e-12){
MIN=1/f;
for(i=0;i<N;i++)
if (fabs(b[i])<1.0e-12) b[i]=0;
fprintf (fp,"最小特征值MIN=%e \n",1/f);
fprintf (fp,"最小特征向量如下: \n",f);
for (i=0;i<20;i++)
fprintf(fp,"Ymin[%2d]=%12e Ymin[%2d]=%12e\n",i,b[i],i+480,b[480+i]);
break;
}
g=f ;
}
//采用矩阵的特殊形态利用反幂法及矩阵的位移求矩阵的最接近MIN+(MAX-MIN)*i/40 i=1,2,3......39的特征值
fprintf (fp,"前39个特征值如下: \n",f);
for (n=1;n<40;n++){
for(i=2;i<N;i++) s[i][2]=(20.2-0.3*i)*sin(0.2*i+0.2)-MIN-(MAX-MIN)*n/40;
s[0][0]=20.2*sin(0.2)-MIN-(MAX-MIN)*n/40;
s[1][1]=19.9*sin(0.4)-MIN-(MAX-MIN)*n/40;
for (i=0;i<N;i++)
b[i]=1;
for (j=0;j<2000;j++){
d=f=0;
for(k=0;k<N;k++)
d+=b[k]*b[k];
d=sqrt (d);
for (m=0;m<N;m++){
c[m]=b[m]/d;
b[m]=c[m];
for(k=0;k<5;k++)
h[m][k]=s[m][k];
}
fprintf (fp,"前39个特征值如下: \n",f);
Function(h,b,N,2,5,1);
for (i=0;i<N;i++) f+=b[i]*c[i];
if(fabs((f-g)/f)<1.0e-12){
fprintf (fp,"R[%2d]=%e \n",n,1/f+MIN+(MAX-MIN)*n/40);
break;
}
g=f;
}
}
fprintf(fp,"cond(A)2=%e",fabs(MAX/MIN));
fclose(fp);
}
输出结果:
最大特征值MAX=1.295227e+002
最大特征向量:
Ymax[ 0]=0.000000e+000 Ymax[480]=2.631399e-007
Ymax[ 1]=0.000000e+000 Ymax[481]=0.000000e+000
Ymax[ 2]=0.000000e+000 Ymax[482]=1.029005e-008
Ymax[ 3]=0.000000e+000 Ymax[483]=0.000000e+000
Ymax[ 4]=0.000000e+000 Ymax[484]=1.458288e-009
Ymax[ 5]=0.000000e+000 Ymax[485]=1.527734e-008
Ymax[ 6]=0.000000e+000 Ymax[486]=0.000000e+000
Ymax[ 7]=0.000000e+000 Ymax[487]=0.000000e+000
Ymax[ 8]=0.000000e+000 Ymax[488]=1.991713e-005
Ymax[ 9]=0.000000e+000 Ymax[489]=3.216506e-004
Ymax[10]=0.000000e+000 Ymax[490]=0.000000e+000
Ymax[11]=0.000000e+000 Ymax[491]=0.000000e+000
Ymax[12]=0.000000e+000 Ymax[492]=0.000000e+000
Ymax[13]=0.000000e+000 Ymax[493]=4.295616e-001
Ymax[14]=0.000000e+000 Ymax[494]=8.650533e-001
Ymax[15]=0.000000e+000 Ymax[495]=2.564592e-001
Ymax[16]=0.000000e+000 Ymax[496]=0.000000e+000
Ymax[17]=0.000000e+000 Ymax[497]=0.000000e+000
Ymax[18]=0.000000e+000 Ymax[498]=1.145012e-004
Ymax[19]=0.000000e+000 Ymax[499]=1.914237e-004
最小特征值MIN=-8.522555e-002
最小特征向量:
Ymin[ 0]=0.000000e+000 Ymin[480]=0.000000e+000
Ymin[ 1]=0.000000e+000 Ymin[481]=0.000000e+000
Ymin[ 2]=0.000000e+000 Ymin[482]=0.000000e+000
Ymin[ 3]=0.000000e+000 Ymin[483]=0.000000e+000
Ymin[ 4]=0.000000e+000 Ymin[484]=0.000000e+000
Ymin[ 5]=0.000000e+000 Ymin[485]=0.000000e+000
Ymin[ 6]=0.000000e+000 Ymin[486]=0.000000e+000
Ymin[ 7]=0.000000e+000 Ymin[487]=0.000000e+000
Ymin[ 8]=0.000000e+000 Ymin[488]=0.000000e+000
Ymin[ 9]=0.000000e+000 Ymin[489]=0.000000e+000
Ymin[10]=-2.421502e-012 Ymin[490]=0.000000e+000
Ymin[11]=7.953745e-012 Ymin[491]=0.000000e+000
Ymin[12]=-1.605720e-011 Ymin[492]=0.000000e+000
Ymin[13]=5.367981e-011 Ymin[493]=0.000000e+000
Ymin[14]=-1.308649e-011 Ymin[494]=0.000000e+000
Ymin[15]=2.314420e-010 Ymin[495]=0.000000e+000
Ymin[16]=5.556372e-010 Ymin[496]=0.000000e+000
Ymin[17]=8.390359e-010 Ymin[497]=0.000000e+000
Ymin[18]=1.477916e-011 Ymin[498]=0.000000e+000
Ymin[19]=-4.625589e-009 Ymin[499]=0.000000e+000
前39个特征值:
R[ 1]=3.056388e+000
R[ 2]=6.489945e+000
R[ 3]=9.564912e+000
R[ 4]=1.275439e+001
R[ 5]=1.632627e+001
R[ 6]=1.921472e+001
R[ 7]=2.229771e+001
R[ 8]=2.597543e+001
R[ 9]=2.868669e+001
R[10]=3.193983e+001
R[11]=3.564729e+001
R[12]=3.937208e+001
R[13]=4.197839e+001
R[14]=4.522796e+001
R[15]=4.888966e+001
R[16]=5.159172e+001
R[17]=5.538324e+001
R[18]=5.852370e+001
R[19]=6.161734e+001
R[20]=6.466978e+001
R[21]=6.821488e+001
R[22]=7.171427e+001
R[23]=7.464117e+001
R[24]=7.759094e+001
R[25]=8.087850e+001
R[26]=8.397963e+001
R[27]=8.701173e+001
R[28]=9.025961e+001
R[29]=9.358174e+001
R[30]=9.576691e+001
R[31]=1.005445e+002
R[32]=1.033006e+002
R[33]=1.075460e+002
R[34]=1.107756e+002
R[35]=1.136181e+002
R[36]=1.160765e+002
R[37]=1.201132e+002
R[38]=1.236528e+002
R[39]=1.269185e+002
cond(A)2=1.519763e+003
Task2 源程序
#include "InLinearEquation.h"
//function declaration
double MAX(double a[5]);
int xDooLittle(int n,double a[5][5],double b[5]);
void m_Multi(double *a, double *b, double *c, int la, int lb, int lc, int r, int s, int t);
void Transpose(double *a, double *ta, int la, int lta, int n, int m);
double Inverse(double *a, double *b, int la, int lb, int n);
void InLinearEquation();
void main()
{
printf("作业二,用迭代法求解非线性方程组\n");
printf("作者 :31090124 杨鸿元\n");
printf("在生成的.txt文件中看结果\n");
InLinearEquation();
}
//InLinearEquation.h
//includes files here
#include <conio.h>
#include <math.h>
#include <memory.h>
#include <process.h>
#include <stdio.h>
int xDooLittle(int n,double a[5][5],double b[5])
//DooLittle 分解法子程序
{
int i,j,k,t,i_k,m[5];
double u[5][5],l[5][5],s[5],y[5],r[5],d[5],a1[5][5],b1[5];
double u_x,l_u,max,temp,a_x;
for(i=0;i<=4;i++)
for(j=0;j<=4;j++) a1[i][j]=a[i][j];
for(i=0;i<=4;i++) b1[i]=b[i];
for(k=1;k<=n;k++){
for(i=k;i<=n;i++){
l_u=0;
for(t=1;t<=k-1;t++)
l_u=l_u+l[i-1][t-1]*u[t-1][k-1];
s[i-1]=a[i-1][k-1]-l_u;
}
max=fabs(s[k-1]);
i_k=k;
m[k-1]=k;
for(i=k;i<=n;i++){
if(fabs(s[i-1])>max){
max=fabs(s[i-1]);
i_k=i;
m[k-1]=i_k;
}
}
if(i_k!=k){
for(t=1;t<=k-1;t++){
temp=l[k-1][t-1];
l[k-1][t-1]=l[i_k-1][t-1];
l[i_k-1][t-1]=temp;
}
for(t=k;t<=n;t++){
temp=a[k-1][t-1];
a[k-1][t-1]=a[i_k-1][t-1];
a[i_k-1][t-1]=temp;
}
temp=s[k-1];
s[k-1]=s[i_k-1];
s[i_k-1]=temp;
}
u[k-1][k-1]=s[k-1];
for(j=k+1;j<=n;j++){
l_u=0;
for(t=1;t<=k-1;t++) l_u=l_u+l[k-1][t-1]*u[t-1][j-1];
u[k-1][j-1]=a[k-1][j-1]-l_u;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -