资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
2017 级数值分析上机实践报告 学院:现代制造技术教育部重点实验室 学号: 姓名: 一、三次样条插值 一、三次样条插值 已知函数值如下表: x 1 2 3 4 5 f(x) 0 0.69314718 1.0986123 1.3862944 1.6094378 x 6 7 8 9 10 f(x) 1.7917595 1.9459101 2.079445 2.1972246 2.3025851 f(x) f(1)=1 f(10)=0.1 试用三次样条插值求 f(5.472)的近似值。 (一) 理论依据 三次样条函数 点a = ? 8. #include 9. double * cal_matrix(int , double *, double *, double *); 10. int cpm_x(double , double *, int); 11. 12. int main() 13. int n = 10, i; 14. / printf(“请输入数据个数:n“); 15. / scanf(“%d“, 16. double hn, un-1, dn+2, *p, test = 5.472, result, Mn+1; 17. double xn = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; 18. double fxn+2 = 0,0.69314718,1.0986123,1.3862944,1.6094378, 19. 1.7917595,1.9459101,2.079445,2.1972246,2.3025851,1,0.1; 20. / printf(“请输入 x 的值:n“); 21. / for(i=0; i0; i-) 74. xi=(zi-ci*xi-1)/ri; 75. return x; 76. 77. 78. int cpm_x(double x0, double *x, int n) 79. int i; 80. for(i=0; i 7. #include 8. #include 9. 10. typedef struct node 11. 12. int num; 13. double T; 14. double S; 15. double C; 16. double R; 17. struct node *next; 18. ParaList; 19. 20. double fun(double ); 21. double calT(ParaList* ,double ,double ); 22. double calS(ParaList*); 23. double calC(ParaList*); 24. double calR(ParaList*); 25. 26. int main() 27. double a = 0, b = 3, eps = 0.00001; 28. 29. /第二题参数 30. / double a = 1, b = 3, eps = 0.00001; 31. 32. / printf(“请输入积分下限n“); 33. / scanf(“%lf“, 34. / printf(“请输入积分上限n“); 35. / scanf(“%lf“, 36. / printf(“请输入 eps“); 37. / scanf(“%lf“, 38. /算前四行的 T,S,C 的值并存入参数链表中 39. ParaList *phead, *p; 40. int i; 41. phead = (ParaList*)malloc(sizeof(ParaList); 42. phead-num = 1; 43. phead-T = (b - a) / 2 * (fun(a) + fun(b); 44. p= phead; 45. for(i=2; ;i+) 46. p-next = (ParaList*)malloc(sizeof(ParaList); 47. p-next-num = i; 48. p-next-T = calT(p, a, b); 49. p-next-S = calS(p); 50. p-next-C = calC(p); 51. p-next-R = calR(p); 52. if(i=5 54. break; 55. 56. p = p-next; 57. 58. 59. 60. double fun(double x) 61. /第一题函数 62. double fresult; 63. fresult = x * pow(1 + pow(x, 2), 0.5); 64. return fresult; 65. 66. 67. /double fun(double x) 68. / /第二题函数 69. / double fresult; 70. / fresult = pow(3, x)*pow(x, 1.4)*(5*x+7)*sin(pow(x, 2); 71. / return fresult; 72. / 73. 74. double calT(ParaList* s, double a, double b) 75. /传入某一行的指针和积分上下限,用于计算下一行的 T 值 76. int i; 77. double sum = 0, tresult; 78. for(i=0; inum -1); i+) 79. sum += fun(a + (i + 0.5) * (b - a) / pow(2, s-num -1); 80. tresult = 0.5 * (s-T + (b - a) / pow(2, s-num -1) * sum); 81. return tresult; 82. 83. 84. double calS(ParaList* t) 85. /传入某一行的指针,用于计算下一行的 S 值 86. double sresult; 87. sresult =(4 * t-next-T - t-T) / 3; 88. return sresult; 89. 90. 91. double calC(ParaList* s) 92. /传入某一行的指针,用于计算下一行的 C 值 93. double cresult; 94. cresult = (16 * s-next-S - s-S) / 15; 95. return cresult; 96. 97. 98. double calR(ParaList* c) 99. /传入某一行的指针,用于计算下一行的 R 值 100. double rresult; 101. rresult = (64 * c-next-C - c-C) / 63; 102. return rresult; 运行结果如下: (三)问题讨论 龙贝格算法通过较为高效的方式求出精度较高的积分, 在通过与复化抛物线积分的比较 时,龙贝格在求得指定精度值,所需要进行的计算次数,远小于抛物线复化求积公式所要求 的划分节点数,且随着精度要求的提高,增长较为平缓。 在设计程序的过程中发现, 龙贝格积分的迭代次数依赖于误差精度, 无法事前判断其迭 代次数,所以这里选择链表来存储 T、S、C、R 四个结果,从而克服数组需要事先制定大小 的缺点。这里可以以通过实时更新 T、S、C、R 值来节约存储空间,考虑到对于计算过程记 录的需求,还是选择将中间值一并存储起来。还需要改进的地方是,可以将待求函数的指针 以及积分上下限作为变量传入龙贝格积分函数中, 从而提高程序的可移植性, 还可用于批量 计算积分。 三、三、Runge-Kutt 方法 用定步长四阶 Runge-Kutta 求解 0)0( 0)0( 0)0( 10010001000/ / 1/ 3 2 1 323 32 1 y y y yydtdy ydtdy dtdy h=0.0005,打印yi(0.025) , yi(0.045) , yi(0.085) , yi(0.1) ,(i=1,2,3) (一)理论依据 四阶古典 Runge-Kutta 公式: 11234 1 21 32 43 (22) 6 11 (,) 22 11 (,) 22 (,) nn n nn nn nn h yykkkk kf kf th yhk kf th yhk kf th yhk 四阶 Runge-Kutta 公式: ? = ?+ ? ? (?+ 3?+ 3?+ ?) ?= (?,?) ?= ?+ ? ?,? + ? ? ?= (?+ ? ?,? ? ? + ?) ?= (?+ ,?+ ? ?+ ?) , (二)C 语言代码 1. /* 2. 数值分析实验习题 3 3. 机械工程 4. 现代制造技术教育部重点实验室 5. */ 6. 7. #include 8. 9. int main() 10. int i; 11. double h = 0.0005; 12. double k1, k2, k3, k4; 13. double y1 = 0.0, y2 = 0.0, y3 = 0.0; 14. for(i=1; i 2. #define MAX 3000 /最多输入 3000 个点进行线性拟和 3. 4. typedef struct POINT/点的结构 5. 6. double x; 7. double y; 8. Point; 9. 10. int main() 11. 12. int m;/输入点的个数 13. int i; 14. Point pointsMAX;/用来存储点 15. static double u11,u12,u21,u22,c1,c2;/用来构建法方程组的变量 16. double a,b,tmp; 17. printf(“n 请输入点数:“); 18. scanf(“%d“, 19. if(mMAX) 20. 21. retur
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号