《数值分析》计算报告
第一次作业
20##年11月
一.计算方案的设计
1.初始化并压缩存储矩阵A
定义矩阵,由矩阵性质可知。根据计算实习说明书要求,所有矩阵的零元素都不存储,所以将矩阵压缩存储为矩阵。在矩阵c中检索矩阵的带内元素的方法为:。
2.求和的值
首先,用幂法求出矩阵按模最大的特征值。然后,根据原点平移法,同样根据幂法求出矩阵按模最大的特征值。当时,,;当时,,;当时,或,若,则,若,则。最后,综上所述,只要求出和,通过比较就可以求出和。
3.求,,的值
用反幂法就可以直接求出。结合上一步求出的,从而很容易求出。其中,用反幂法求的过程中用到了Doolittle分解,即把矩阵写成,是上三角矩阵,所以的值就是所有矩阵主对角线元素的乘积。
4.求的与最接近的特征值
用带平移的反幂法求出的值然后加上就是,即:求出矩阵按模最小的特征值,。
二.计算源程序
File1 初始化的函数(shushihua)
#include<stdio.h>
#include<math.h>
void chushihua(double A[5][501])
{
int i;
for(i=0;i<501;i++)
{
A[2][i]=(1.64-0.024*(i+1))*sin(0.2*(i+1))-0.64*exp(0.1/(i+1));
A[0][i]=A[4][i]=-0.064;
A[1][i]=A[3][i]=0.16;
}
A[0][0]=A[0][1]=A[1][0]=A[4][500]=A[4][499]=A[3][500]=0;
}
File 2 幂法的函数 (mifa)
#include<stdio.h>
#include<math.h>
double mifa(double A[5][501])
{ int i,j,t,k=0;
double g,B=1,c=2,u[501],y[501];
for(i=0;i<501;i++)
{
u[i]=1;
}
do
{
g=0;
c=B;
for(i=0;i<501;i++)
{
g=u[i]*u[i]+g;
}
g=sqrt(g);
for(i=0;i<501;i++)
{
y[i]=u[i]/g;
}
for(i=0;i<501;i++)
{
u[i]=0;
for(j=0;j<501;j++)
{
t=i-j+2;
if(t>=0&&t<=4)
{
u[i]=A[t][j]*y[j]+u[i];
}
}
}
B=0;
for(i=0;i<501;i++)
{
B=y[i]*u[i]+B;
}
k=k++;
}
while(fabs((B-c)/B)>1e-12);
return(B);
}
File 3 Doolittle分解 (doolittle)
#include<stdio.h>
#include<math.h>
void doolittle(double A[5][501])
{
int k,i,j,t,ik;
double S[501],Max,B=1;
for(k=1;k<=501;k++) //*用选主元Doolittle分解法解方程组(LU分解)*//
{
ik=k;
S[k-1]=0;
for(t=1;t<=k-1;t++)
if(fabs(k-t)<3)
S[k-1]=A[k-t+2][t-1]*A[t-k+2][k-1]+S[k-1];
S[k-1]=A[2][k-1]-S[k-1];
Max=S[k-1];
for(i=k;i<=501;i++)
{
S[i-1]=0;
for(t=1;t<=k-1;t++)
if(fabs(i-t)<3&&fabs(t-k)<3)
S[i-1]=A[i-t+2][t-1]*A[t-k+2][k-1]+S[i-1];
if(fabs(i-k)<3)
S[i-1]=A[i-k+2][k-1]-S[i-1];
else
S[i-1]=0-S[i-1];
}
A[2][k-1]=Max;
for(j=k+1;j<=501;j++) //*求Ukj*//
{
B=0;
for(t=1;t<=k-1;t++)
if(fabs(k-t)<3&&fabs(t-j)<3)
B=A[k-t+2][t-1]*A[t-j+2][j-1]+B;
if(fabs(k-j)<3)
A[k-j+2][j-1]=A[k-j+2][j-1]-B;
}
for(i=k+1;i<=501;i++) //*求Lik*//
if(fabs(i-k)<3)
A[i-k+2][k-1]=S[i-1]/A[2][k-1];
}
}
File 4 反幂法的函数 (fanmifa)
#include<stdio.h>
#include<math.h>
double fanmifa(double A[5][501])
{
extern void doolittle(double A[5][501]);
int k,i,j,t,ik,K=0;
double S[501],x[501],u[501],y[501],H,D,Max,g,B=1,c=2,det;
doolittle(A);
for(i=0;i<501;i++)
{
u[i]=1;
}
do //*求按模最小特征值*//
{
g=0;
c=B;
for(i=0;i<501;i++)
{
g=u[i]*u[i]+g;
}
g=sqrt(g);
for(i=0;i<501;i++)
{
y[i]=u[i]/g;
}
x[0]=y[0]; //*求解x、y*//
for(i=2;i<=501;i++)
{
B=0;
for(t=1;t<=i-1;t++)
{
if(fabs(i-t)<3)
{
B=B+A[i-t+2][t-1]*x[t-1];
}
x[i-1]=y[i-1]-B;
}
}
u[501-1]=x[501-1]/A[2][501-1]; //*求x*//
for(i=501-1;i>=1;i--)
{
B=0;
for(t=i+1;t<=501;t++)
{
if(fabs(i-t)<3)
{
B=B+A[i-t+2][t-1]*u[t-1];
}
u[i-1]=(x[i-1]-B)/A[2][i-1];
}
}
B=0;
for(i=0;i<=500;i++)
{
B=y[i]*u[i]+B;
}
K=K++;
}
while(fabs((1/B-1/c)/(1/B))>1e-12);
B=1/B;
return(B);
}
最终主程序:
#include<stdio.h>
#include<math.h>
void blank(void);//定义函数输出空格。
void star1(void);//定义函数输出星号。
void star2(void);//定义函数输出星号。
void blank(void)//函数代码
{
printf(" ");
}
void star1(void)//函数代码。
{
blank();
for(int ii=0;ii<=61;ii++)
{
printf("*");
}
printf("\n");
}
void star2(void)//函数代码。
{
for(int ii=0;ii<=17;ii++)
{
printf("*");
}
}
void main()
{extern void chushihua(double A[5][501]);
extern double mifa(double A[5][501]);
extern double fanmifa(double A[5][501]);
int i,j,k=0;
double A[5][501],u[501],R[39],R_s,cond,B1,B2,det=1,uk[39];
chushihua(A);
B1=mifa(A);
for(i=0;i<501;i++)
{
A[2][i]=A[2][i]-B1;
}
B2=mifa(A);
B2=B2+B1;
chushihua(A); //求条件数cond
R_s=fanmifa(A);
cond=fabs(B1/R_s);
for(i=0;i<501;i++) //求行列式的值det
{
det=A[2][i]*det;
}
for(i=0;i<39;i++)
{
uk[i]=B1+(i+1)*(B2-B1)/40;
}
for(i=0;i<39;i++)
{
chushihua(A);
for(j=0;j<501;j++)
{
A[2][j]=A[2][j]-uk[i];
}
R[i]=uk[i]+fanmifa(A);
}
star1();
blank();
star2();
printf(" 数 值 分 析 大 作 业 1 ");
star2();
printf("\n");
blank();
star2();
printf(" 北 京 航 空 航 天 大 学 ");
star2();
printf("\n");
blank();
star2();
printf(" 宇 航 学 院 ");
star2();
printf("\n");
blank();
star2();
printf(" 学 生:向 纪 鑫 ");
star2();
printf("\n");
blank();
star2();
printf(" 学 号: SY1415313 ");
star2();
printf("\n");
star1();
if(B2>B1) //输出结果
printf("λ1=%.11e\nλ501=%.11e\n",B1,B2);
else
printf("λ1=%.11e\nλ501=%.11e\n",B2,B1);
printf("λs=%.11e\n",R_s);
printf("cond=%.11e\n",cond);
printf("det=%.11e\n",det);
for(i=0;i<39;i++)
{
printf("R[%d]=%.11e\n",i+1,R[i]);
}
}
3.计算结果
4.迭代初始向量的选取对迭代结果的影响
在初始向量为u0=[1 … .. .. 1 1]的情况下,幂法求得= -1.07001136150e+001 迭代343次;反幂法求=-5.55791079423e-003,迭代22次。当使用初始向量u0=[1 … .. .. 0 0]时,=-2.08098108524e+000,幂法迭代160次;=2.66888692378e-002,反幂法迭代231次;相应的其他特征值和其迭代次数也发生了变化。
因此初始向量的选择不同,将导致最终结果不同。幂法迭代公式的实质是,是的单位化,不同使和不同,也将不同,近似为特征值,于是特征值不同。迭代次数的差异是由于初始向量到特征向量远近不同而导致的。反幂法同理。
在实际工程计算时,要根据工程实际的情况,估计一个比较可能的结果,来把它作为迭代的初始向量,这样可以极大的提高精度,减少迭代次数。
第二篇:如何写一份好的数据分析报告
在谈这个问题之前先说说写一份好的数据分析报告/邮件的重要性,很简单,因为分析报告的输出是是你整个分析过程的成果,是评定一个产品一个运营事件的定性结论,很可能是产品决策的参考依据,既然这么重要那当然要写好它了。
我认为一份好的分析报告,首先要有一个好的框架,跟盖房子一样,好的分析肯定是有基础有层次,有基础坚实,并且层次明了才能让阅读者一目了然,架构清晰、主次分明才能让别人容易读懂,这样才让人有读下去的欲望;
第二,每个分析都有结论,而且结论一定要明确,如果没有明确的结论那分析就不叫分析了,也失去了他本身的意义,因为你本来就是要去寻找或者印证一个结论才会去做分析的,所以千万不要忘本舍果;
第三,分析结论不要太多要精,如果可以的话一个分析一个最重要的结论就好了,很多时候分析就是发现问题,如果一个一个分析能发现一个重大问题,就达到目的 了,不要事事求多,宁要仙桃一口,不要烂杏一筐,精简的结论也容易让阅者接受,减少重要阅者(通常是事务繁多的领导,没有太多时间看那么多)的阅读心理门 槛,如果别人看到问题太多,结论太繁,不读下去,一百个结论也等于0;
第四、分析结论一定要基于紧密严禁的数据分析推导过程,不要有猜测性的结论,太主观的东西会没有说服力,如果一个结论连你自己都没有肯定的把握就不要拿出来误导别人了;
第五,好的分析要有很强的可读性,这里是指易读度,每个人都有自己的阅读习惯和思维方式,写东西你总会按照自己的思维逻辑来写,你自己觉得很明白,那是因 为整个分析过程是你做的,别人不一定如此了解,要知道阅者往往只会花10分钟以内的时间来阅读,所以要考虑你的分析阅读者是谁?他们最关心什么?你必须站 在读者的角度去写分析邮件;
第六,数据分析报告尽量图表化,这其实是第四点的补充,用图表代替大量堆砌的数字会有助于人们更形象更直观地看清楚问题和结论,当然,图表也不要太多,过多的图表一样会让人无所适从;
第七、好的分析报告一定要有逻辑性,通常要遵照:1、发现问题--2、总结问题原因--3、解决问题,这样一个流程,逻辑性强的分析报告也容易让人接受;
第八、好的分析一定是出自于了解产品的基础上的,做数据分析的产品经理本身一定要非常了解你所分析的产品的,如果你连分析的对象基本特性都不了解,分析出来的结论肯定是空中楼阁了,无根之木如何叫人信服?!
第九、好的分析一定要基于可靠的数据源,其实很多时候收集数据会占据更多的时间,包括规划定义数据、协调数据上报、让开发人员 提取正确的数据或者建立良好的数据体系平台,最后才在收集的正确数据基础上做分析,既然一切都是为了找到正确的结论,那么就要保证收集到的数据的正确性, 否则一切都将变成为了误导别人的努力;
第十、好的分析报告一定要有解决方案和建议方案,你既然很努力地去了解了产品并在了解的基础上做了深入的分析,那么这个过程就决定了你可能比别人都更清楚 第发现了问题及问题产生的原因,那么在这个基础之上基于你的知识和了解,做出的建议和结论想必也会更有意义,而且你的老板也肯定不希望你只是个会发现问题 的人,请你的那份工资更多的是为了让你解决问题的;
十一、不要害怕或回避“不良结论”,分析就是为了发现问题,并为解决问题提供决策依据的,发现产品问题也是你的价值所在,相信你的老板请你来,不是光让你 来唱赞歌的,他要的也不是一个粉饰太平的工具,发现产品问题,在产品缺陷和问题造成重大失误前解决它就是你的分析的价值所在了;
十二、不要创造太多难懂的名词,如果你的老板在看你的分析花10分钟要叫你三次过去来解释名词,那么你写出来的价值又在哪里呢,还不如你直接过去说算了,当然如果无可避免地要写一些名词,最好要有让人易懂的“名词解释”;
十三、最后,要感谢那些为你的这份分析报告/邮件付出努力做出贡献的人,包括那些为你上报或提取数据的人,那些为产品作出支 持和帮助的人(如果分析的是你自己负责的产品),肯定和尊重伙伴们的工作才会赢得更多的支持和帮助,而且我想你也不是只做一锤子买卖,懂得感谢和分享成果 的人才能成为一个有素养和受人尊敬的产品经理;
最后希望每个产品经理都能有良好的数据分析能力,每次分析都能写得很出色,成为优秀成功的产品经理!:)