计算机数值方法与算法-拉格朗日插值多项式总结
2017-04-12 21:45
239 查看
lagrange问题
作业是编写拉格朗插值,但是遇到了过去编程没有遇到过的问题。作业:《计算机数值方法》第1次编程作业——拉格朗日插值
自行插值问题或按如下关于函数y=f(x)的数据表格,用拉格朗日插值求待求插值点t(例如t=0.13、t=0.63、t=1.03等等)的函数近似值ft。(要求根据t的大小,自动选取8个点用7次拉格朗日插值计算)
i —–xi — —yi —— i—-xi ——–yi
1 0.10 0.1103329 11 0.60 1.0288456
2 0.15 0.1736223 12 0.65 1.1592592
3 0.20 0.2426552 13 0.70 1.2972951
4 0.25 0.3176729 14 0.75 1.4430292
5 0.30 0.3989105 15 0.80 1.5965053
6 0.35 0.4865951 16 0.85 1.7577308
7 0.40 0.5809439 17 0.90 1.9266733
8 0.45 0.6821617 18 0.95 2.1032563
9 0.50 0.7904390 19 1.00 2.2873552
10 0.55 0.9059492 20 1.05 2.4787929
程序结构要求:
(1) 编写拉格朗日插值函数
double Lagrange(double x[],double y[],double t,int n)
{ …… }
//函数参数说明:x[]和y[]为一维数组形参,表示表格中的数据;t为待求点;n为表格中的结点数。
(2) 主函数main()调用上面的函数完成计算并输出结果。
#include<iostream> #include<cmath> using namespace std; double Lagrange(double *x, double *y, double t, int n) {// 传值 double ft=0.0; int i; for (i = 1; i<20 && x[i]<t; i++); cout << "i" <<i<< endl; for(int q=0;q<20;q++) { cout << q<<"\t "<<x[q] << "\t " << y[q] << endl;//测验 } double *ax = new double ; double *bx = new double ;//new空间 让自己输出,然后让可以明白. if (n / 2 <= i&&i<(20 - n / 2 + 1) ){ for (int k = 0; k<n; k++) { ax[k] = x[i + k-4]; cout << "ax" << k << "=\t" << ax[k] << endl;; bx[k] = y[i + k-4]; //cout << "bx" << k << "=" << bx[k]; } cout << "first" << endl; } else if (n / 2<i)//前面N个点 { for (int k = 0; k<n; k++) { ax[k] = x[1 + k]; bx[k] = y[1 + k]; } cout << "two" << endl; } else//后面N个点 { be5d for (int k = 0; k<n; k++) { ax[k] = x[20 - n + 1 + k]; bx[k] = y[20 - n + 1 + k]; } cout << "houmian" << endl; } double tmp = 1.0; //这里错了,后面一直去测试,发现,tmp,每次循环都保留一个值,造成错误,应该把tmp放置再第一个循环 for (int j = 0; j<=n; j++)//n=8 { for (int k = 0; k <=j - 1; k++) { tmp = tmp*((t - ax[k]) / (ax[j] - ax[k])); //cout << "tmp的值" << tmp<<" "; //cout << "k和j的值" << k << " " << j << endl; //cout << "((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])):"<<((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])) << endl; //cout << "t-ax"<<k<<" "<< (fabs)(t - ax[k]) <<"ax"<<j<<"ax"<<k<<" "<< (fabs)(ax[j] - ax[k]) <<" tmp:"<<tmp; } for (int k = j + 1; k <= n; k++) { tmp = tmp*((t - ax[k]) / (ax[j] - ax[k])); //cout << "tmp的值" << tmp <<" "; //cout << "k和j的值" << k << " " << j << endl; //cout << "((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])):" << ((fabs)(t - ax[k]) / (fabs)(ax[j] - ax[k])) << endl; } ft= ft + tmp*bx[j]; } return ft; } int main() { double x[21] = { 0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45, 0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95, 1.00,1.05 }; double y[21] = { 0.1103329,0.1736223,0.2426552,0.3176729,0.3989105, 0.4865951,0.5809439,0.6821617,0.7904390,0.9059492,1.0288456, 1.1592592,1.2972951,1.4430292,1.5965053,1.7577308,1.9266733, 2.1032563,2.2873552,2.4787929 }; double t; int n; cout << "输入插值点t的值" << endl; cin >> t; cout << "选取8个点作插值运算" << endl; n = 8; double *px = x; double *py = y; cout << *px << " " << *py<<endl; double k=Lagrange(px, py, t, n); cout << k; system("pause"); return 0; }
相关文章推荐
- 计算机调度算法 - NP-Hard问题 的 “背包问题” 的简单总结
- 4000 复杂积分的计算机模拟数值计算方法
- 算法 - 内部排序方法总结
- String 常用方法最优算法实现总结 (三) -- findCommonSubstring 和difference
- 数值方法·自适应辛普森算法
- 算法-寻找第K大的数的方法总结
- 【算法】上一篇的续:一些计算机操作的二进制总结
- 数组中常用算法(方法)总结
- 算法设计之五大常用算法设计方法总结
- 计算机网络自顶向下方法中文第六版总结(1)
- 计算机专业面试笔试问题之大数据量,海量数据 处理方法总结
- 计算机专业找工作面试面经总结(操作系统,数据库,数据结构,算法,虚拟化,编程实践等)
- 计算机操作系统中常用的调度算法总结
- String 常用方法最优算法实现总结 (二)
- 13 算法/分析方法的优化以及总结
- C语言数值交换方法总结
- 计算机数值计算与方法-二牛顿插值
- 【算法】滑动窗方法问题总结
- c++ 泛型算法 使用方法总结
- 计算机博弈大赛参赛程序算法总结