- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北航数值分析B第二题报告完整版详解.doc
数学分析B
计算实习题目—第二题
算法设计方案
总体思路:由于需要四种方法进行细化,所以大体需要四个模块,实际上采用在main函数里面进行声明和调用几个子函数,f1(),f2(),f3(),分别是线性插值,二次插值和三次插值,prepare()函数用于求关于Mi的线性方程的参数,chase()函数用于采用追赶法求出Mi,three_moment()函数用于求出三弯矩法的y表达式,求出各种方法下的y的表达式后,进而x就容易求了,利用final_data()函数将数据输出,在matlab下画出细化后的轮廓线。
线性插值:插值法均采用牛顿法,d[]用于存放一阶差商值,这个值不仅在线性插值中要用,在二次插值与三次插值中都需要它进行计算,同理,二次插值中的二阶差商也要用作三次插值中的计算。线性插值算出一阶差商后基本就可以代入公式得到y的表达式了。
二次插值:每三个点为一个插值区域,共六个插值区域,利用差商表计算得出二阶差商,展开牛顿二次插值多项式,得出结果。
三次插值:每四个点为一个插值区域,共四个插值区域,这时计算量就已经有点大了,为简化运算,采用不单独计算,而是在二次插值的基础上进行计算,利用二次插值的已有数据,但是有两个二次插值在二次插值函数中并没有得到计算,即f(x3,x4,x5)和f(x7,x8,x9),所以在二次插值函数中要添加相关代码。
样条插值:计算最为复杂,但其实并不比三次插值容易错,因为只是公式很多,所以化为三个函数来完成,每个函数负责一部分计算。
输出数据:前面的计算只是算出公式,对于不同的插值法,y的分段表达式不一样,采用if,else if语句以及for循环并用到了pow()函数算幂,完成对表中数据x从1到190的细化。
全部源程序
#includestdio.h
#includemath.h
double x[13]={0.00,4.74,9.50,19.00,38.00,57.00,76.00,95.00,114.00,133.00,152.00,171.00,190.00};
double y[13]={0.00,5.32,8.10,11.97,16.15,17.10,16.34,14.63,12.16,9.69,7.03,3.99,0.00};
double d[12]={0};//存放一阶差商
double da[12]={0};//存放线性插值常数项
double dt[8]={0};//存放二阶差商
double dta[8]={0};//存放二阶插值x项系数
double dtb[8]={0};//存放二阶插值常数项
double ddt[4]={0};//存放二阶差商用作计算三阶差商
double dth[4]={0};//存放三阶差商
double dtha[4]={0};//存放三阶插值附加x^2项系数
double dthb[4]={0};//存放三阶插值附加x项系数
double dthc[4]={0};//存放三阶插值附加常数项
double h[13]={0};//存放样条插值的一些参数
double a[13]={0};
double b[13]={0};
double c[13]={0};
double e[13]={0};
double p[13]={0};
double q[13]={0};
double z[13]={0};
double m[13]={0};
double ta[12]={0};
double tb[12]={0};
double tc[12]={0};
double td[12]={0};
double ans1[190]={0};
double ans2[190]={0};
double ans3[190]={0};
double ans4[190]={0};
void main()//调用几个子程序
{
void f1(); //线性插值
void f2();//二次插值
void f3();//三次插值
void prepare();//样条插值计算关于Mn的线性方程组的有关参数
void chase();//追赶法解线性方程组
void three_moment();//三弯矩法
void final_data();
f1();
f2();
f3();
prepare();
chase();
three_moment();
final_data();
}
void f1()//线性插值函数
{
int i=0;
printf(分段线性插值法:\n\n);
for(i=0;i12;i++)
{
d[i]=(y[i+1]-y[i])/(x[i+1]-x[i]);
da[i]=y[
文档评论(0)