牛顿插值多项式

 1 //题目要求:用牛顿差商公式进行插值
 2 #include <iostream>
 3 #include <cmath>
 4 #include <cstring>
 5 using namespace std;
 6 #define numofx 20                //定义数据量的大小
 7 struct data{
 8     double x;
 9     double fx;                   //定义进行运算的点(x,fx)
10 }pointdata[numofx];
11
12 //求差商f(x0,x1,x2...xn)的公式
13 long double chashang(int n){     //计算f[x0,x1,x2...xn]
14     if(n<=0){
15         return 0;
16     }
17
18     long double result=0;
19     for(int i=0;i<=n;i++){
20         //计算这0~n的计算值的和
21         long double resproduct=1;
22         for(int j=0;j<=n;j++){
23             if(j!=i){
24                 resproduct*=(pointdata[i].x-pointdata[j].x);
25             }
26         }
27         long double temp=pointdata[i].fx/resproduct;
28         result+=temp;
29     }
30     return result;
31 }
32
33 int main(){
34     int numofpoint;
35     cout<<"将要输入的插值点的个数为:";
36     cin>>numofpoint;
37     cout<<"请依次输入x,fx的值:\n";
38     for(int i=0;i<numofpoint;i++){
39         cin>>pointdata[i].x>>pointdata[i].fx;
40     }
41
42     //打印输出牛顿差商公式 ,未简约
43     cout<<"由以上插值点计算出的牛顿插值多项式为:\n";
44     cout<<"f(x)="<<pointdata[0].fx;
45     for(int i=1;i<numofpoint;i++){
46         long double temp4=chashang(i);
47         if(temp4>=0){
48             cout<<"+"<<temp4<<"*";
49         }
50         else{
51             cout<<temp4<<"*";
52         }
53
54         for(int j=0;j<i;j++){
55             cout<<"(x-"<<pointdata[j].x<<")";
56         }
57     }
58
59     //计算某个x的牛顿插值多项式近似值
60     double x;
61     cout<<"\n\n请输入所求变量x的值:";
62     cin>>x;
63     cout<<"牛顿插值多项式近似结果为:";
64
65     long double res=pointdata[0].fx;        //牛顿差商公式的f(x0)项
66     for(int i=0;i<numofpoint-1;i++){        //牛顿插值多项式项f[x0,x1...xn](x-x0)(x-x1)...(x-xn) n>=1
67
68         long double temp=1;
69         for(int j=0;j<=i;j++){
70             temp=temp*(x-pointdata[j].x);
71         }
72
73         res=res+chashang(i+1)*temp;
74     }
75     cout<<res<<endl;
76 } 

拉格朗日插值的程序:

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4
 5 class lagrange{
 6
 7     private:
 8         int i,j,n;
 9         double mult,sum,z;
10         double *x,*y;
11
12     public:
13         void interpolation(){
14             ifstream fin("a.txt");
15             fin>>n;
16             x=new double[n];
17             y=new double[n];
18             for(i=0;i<n;i++){
19                 fin>>x[i]>>y[i];
20             }
21             fin.close();
22             cout<<"\n输入需要插值的点:";
23             cin>>z;
24             sum=0.0;
25
26             for(i=0;i<n;i++){
27                 mult=1.0;
28                 for(j=0;j<n;j++){
29                     if(j!=i){
30                         mult*=(z-x[j])/(x[i]-x[j]);
31                     }
32                 }
33                 sum+=mult*y[i];
34             }
35             cout<<"\n插补的值="<<sum<<endl;
36
37         }
38
39         ~lagrange(){
40             delete[] x,y;
41         }
42
43 };
44
45 int main(){
46     lagrange interp;
47     interp.interpolation();
48 } 
时间: 2024-10-02 21:06:16

牛顿插值多项式的相关文章

【数值分析】拉格朗日插值与牛顿插值

在工程应用和科学研究中,经常要研究变量之间的关系y=f(x).但对于函数f(x),常常得不到一个具体的解析表达式,它可能是通过观测或实验得到的一组数据(x,f(x)),x为一向量;或则是解析表达式非常复杂,不便于计算和使用.因此我们需要寻找一个计算比较简单的函数S(x)近似代替f(x),并使得S(x)=f(x),这种方法就称为插值法. 常用的插值法有: 一维插值法:拉格朗日插值.牛顿插值.分段低次插值.埃尔米特插值.样条插值. 二维插值法:双线性插值.双二次插值. 拉格朗日插值法 已知函数f(x

插值相关总结

插值的通俗解释就是一种用一些已知的数据去预测想要的数据的方法. 多项式插值 多项式插值是最常见的一种函数插值(插值函数为多项式). $${p_n}(x) = {a_0} + {a_1}x + {a_2}{x^2} +  \cdots  + {a_n}{x^n}$$ 从几何上看可以理解为:已知平面上n+1个不同点,要寻找一条n次插值多项式函数$p(x)$通过曲线$f(x)$上已知的这n+1个点.使$p(x)$接近$f(x)$. 而将n个点代入多项式函数,则可用方程组表示,即 $$\left\{\b

等距结点下的Newton插值多项式系数计算(向前差分)

插值多项式的牛顿法 1.为何需要牛顿法? ? 使用Lagrange插值法不具备继承性.当求好经过\(({x_0},{y_0})-({x_n},{y_n})\)共n+1个点的插值曲线时候,如果再增加一个点,由Lagrange插值法通式\[\sum_{k=0}^{n}\frac{\prod_{i=0,i\ne k}^{n}(x-x_i)}{\prod_{i=0,i\ne k}^{n}(x_k-x_n)}y_k\]可以知道,当再增加一个点时候,Lagrange 多项式还要重新计算以确定系数. 2.牛顿

牛顿插值法及其C++实现

h1 { margin-bottom: 0.21cm } h1.western { font-family: "Liberation Sans", sans-serif; font-size: 18pt } h1.cjk { font-family: "Noto Sans CJK SC Regular"; font-size: 18pt } h1.ctl { font-family: "Noto Sans CJK SC Regular"; fon

牛顿迭代法求解平方根

牛顿迭代法求解平方根 2015-05-16 10:30 2492人阅读 评论(1) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一个实例 迭代简介 牛顿迭代法 牛顿迭代法简介 简单推导 泰勒公式推导 延伸与应用 一个实例 //java实现的sqrt类和方法 public class sqrt { public static double sqrt(double n) { if (n<0) return Double.NaN; double err = 1e

c语言实现牛顿迭代法

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #include<float.h> 5 #include<time.h> 6 7 #define PI 3.14159265358979323846 /* pi */ 8 #define ε 1.0e-12 9 int main() 10 { 11 double x0 = PI;//取的初始值 12 double x1 =

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

经典算法:牛顿迭代法求平方根

//牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/(2*x); 7 y = x*x-num; 8 if(y<0) y = -y; 9 } while(y>0.0001); 10 return x; 11 } 12 int main(int argc, char* argv[]) 13 { 14 printf("%.3f",my

牛顿迭代法是如何求平方根的

看<SICP>,提到牛顿迭代(Newton's method)求平发根,有一些想法,记下来 比如给出的数字是 y假设其平方根为 gy 猜想一个数字 x 如果 x==gy,那 y/x==gy 下面重点来了,如果 x!=gy 可能 x<gy,y/x>gy 或者 x>gy,y/x<gy 一大一小,故 (x+y/x)/2 比 x 更接近 gy不断迭代…… --date: 2014-12-22