计算机数值方法与算法-拉格朗日插值多项式总结
来源:互联网 发布:select linux 编辑:程序博客网 时间:2024/06/05 03:51
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[n]; double *bx = new double[n];//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个点 { 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;}
- 计算机数值方法与算法-拉格朗日插值多项式总结
- 数值方法:多项式插值
- 计算机数值方法
- 计算机数值计算与方法-二牛顿插值
- 计算机中数值的表示方法
- 数值分析:Hermite多项式
- 算法设计与分析:第三章 分治 3.4多项式乘积的分治方法
- 数据结构与算法分析笔记与总结(java实现)--字符串4:表示数值的字符串
- 数据结构与算法——多项式加法
- 算法导论之多项式与快速傅里叶变换
- 多项式链表-算法设计与数据结构
- 算法求解方法与思路的总结
- C++数值--字符串间转换方法总结
- C语言数值交换方法总结
- 算法分析与设计-02-勒让德多项式的递归算法
- 数字电路(一)计算机历史、数值与码制
- 图论算法与计算机
- 计算机算法设计与分析
- BZOJ 2555 SubString LCT 后缀自动机
- 微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据 上篇
- HDU2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- DFS应用(拓扑排序和强连通分支)
- 文章标题
- 计算机数值方法与算法-拉格朗日插值多项式总结
- SSH_day01:helloWorld
- 软件项目管理工具对比----推进敏捷开发管理工具的使用
- CCF推荐-计算机网络领域顶级期刊会议
- 武大网络赛H题
- unity3d之AI初级将AI角色抽象成一个质点---Vehicle类
- POJ 3270 Cow Sorting (置换群)
- 浅谈GC的基本原理
- JDBC