插值算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//显示前 num 个点
repaint(); try{ thread.sleep(50); } catch(InterruptedException e) { } } } public void paintComponent(Graphics g) { g.setColor(Color.white); g.clearRect(0, 0, 400, 440); g.setColor(Color.red); g.drawLine(0, 200, 400, 200); g.drawLine(200, 400, 200, 0); g.translate(200,200); g.setColor(Color.blue); for(int i=0;i<num;i++) { g.drawLine((int)xpoint[i],-(int)(ypoint[i]),(int)xpoint[i+1],-(int)(ypoint[i+1])); } g.setColor(Color.black); g.drawString("x[ ]={1.0,2.0,3.0,4.0,5.0,6.0,7.0}",-190,-180); g.drawString("y[ ]={0.1,0.4,0.9,1.6,2.5,3.6,4.9}",-190,-160); g.drawString("牛顿插值算法",-180,-100); //g.drawString(""+xpoint[60]+" "+ypoint[60],-180,-50); } }
三.运行结果截图
实验五 牛顿插值算法
牛顿插值公式: Pn (x)=a0+a1(x-x0)+…+ an(x-x0)(x-x1)…(x-xn-1)
一.参考算法
1.Input{x0,…,xn, a1,…,an} 2. Until 无新的 x 2.1 Input{x} 2.2 p←an 2.3 For i=n-1,n-2,…,1,0 2.3.1 p←p*(x-xi)+ai 2.4 Output{p}
} class MyPanel extends JPanel implements Runnable { Thread thread; double xpoint[],ypoint[]; double x[]={0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0}; //double y[]={1,1.414214,1.732051,2,2.236068,2.449490,2.645751}; double y[]={0.0,5,20,45,80,125,180,245,320}; int N=4; double t=1.0; double s=0.0; int num; public MyPanel() { xpoint=new double[80]; ypoint=new double[80]; setSize(500, 500); thread=new Thread(this); ////////////////////////以下计算拉格朗日插值 for(int i=0,k=0;i<80;i++) { xpoint[i]=k; k++; s=0.0; for(int m=0;m<N;m++) { t=1.0; for(int n=0;n<N;n++) { if(n!=m) { t=t*(xpoint[i]-x[n])/(x[m]-x[n]); } } s=s+t*y[m]; } ypoint[i]=s; } } public void run()
二.源代码
import java.awt.*; import java.awt.event.*; import javax.swing.*;
public class Newton {
/** * Creates a new instance of <code>Newton</code>. */ public Newton() { } /** * @param args the command line arguments */ public static void main(String[] args) { new newFrame().init(); } }
class newFrame extends JFrame { public void init() { MyPanel hello=new MyPanel(); getContentPane().add(hello); hello.thread.start(); //以下代码设置 JFrame 窗体的外观 setSize(400,400); setLocation(200,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } } class MyPanel extends JPanel implements Runnable { Thread thread; double xpoint[],ypoint[]; double x[]={1.0,2.0,3.0,4.0,5.0,6.0,7.0}; //double y[]={1.0,1.414214,1.732051,2.0,2.236068,2.449490,2.645751}; double y[]={0.1,0.4,0.9,1.6,2.5,3.6,4.9}; double a[]; double p; int N=7;
class newFrame extends JFrame { public void init() { MyPanel hello=new MyPanel(); getContentPane().add(hello); hello.thread.start(); //以下代码设置 JFrame 窗体的外观 setSize(400,400); setLocation(200,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); }
{ for(num=2;num<79;num++) //显示前 num 个点 { repaint(); try{ thread.sleep(50); } catch(InterruptedException e) { } } } public void paintComponent(Graphics g) { g.setColor(Color.white); g.clearRect(0, 0, 400, 440); g.setColor(Color.red); g.drawLine(0, 300, 400, 300); g.drawLine(200, 400, 200, 0); g.translate(200,300); g.setColor(Color.blue); for(int i=0;i<num;i++) { g.drawLine((int)xpoint[i],-(int)(ypoint[i]),(int)xpoint[i+1],-(int)(ypoint[i+1])); } g.setColor(Color.black); g.drawString("x[ ]={1.0,2.0,3.0,4.0,5.0,6.0,7.0}",-190,-280); g.drawString("y[ ]={0.1,0.4,0.9,1.6,2.5,3.6,4.9}",-190,-260); g.drawString("拉格朗日插值算法",-180,-200); //g.drawString(""+xpoint[54]+" "+ypoint[54],-180,-50); } }
2.2.2.1 If i!=k,Then p←p*(x-xi)/(xk-xi) 2.2.3 S←S+p 2.3 Output{y}
二.源代码
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Lagrange { /** * Creates a new instance of <code>Lagrange</code>. */ public Lagrange() { } /** * @param args the command line arguments */ public static void main(String[] args) { new newFrame().init(); } }
求 an 的算法:
1. Input {x0,y0,…,xn,yn} 2. for j=0 to n 2.1
aj yj
3.1 for j=n to k step -1 3.1.1
3. for k=1 to n
j aj 1 aj a xj xj k
4ቤተ መጻሕፍቲ ባይዱ5
Output
{a0,a1…an}
插值算法
实验目的
通过上机实现拉格朗日、牛顿和三次自然样条三种插值算法,了解并掌握 拉格朗日、牛顿和三次自然样条三种插值算法的内涵。通过动态演示曲线生成 全过程,分析并比较三种插值算法的优缺点,深刻理解这些算法。
实验内容与要求
已知 f(xn)=yn ,n=0,1,2,…,N;求通过这 N+1 个节点{(xn,yn)| n=0,1,2,…,N } 的插值函数 Pn (x)。 设计出具体的程序,分别使用拉格朗日插值,牛顿插值和 三次自然样条三种算法绘制出相应的插值曲线。 用三条不同颜色的曲线来表示三 种插值方法在一段区间内的插值函数。要求动态显示曲线绘制全过程。
int num; public MyPanel() { xpoint=new double[100]; ypoint=new double[100]; setSize(500, 500); thread=new Thread(this); a=new double[7]; ///////////////////////////以下计算差商值保存在数组 a 中 for(int i=0;i<N;i++) { a[i]=y[i]; } for(int k=1;k<N;k++) { for(int j=N-1;j>=k;j--) { a[j]=(a[j]-a[j-1])/(x[j]-x[j-k]); } } ////////////////////////////以下计算牛顿插值 for(int i=0,k=-50;i<100;i++) { xpoint[i]=k; p=a[N-1]; for(int j=N-1;j>=0;j--) { p=p*(xpoint[i]-x[j])+a[j]; } k++; ypoint[i]=p; } } public void run() { for(num=2;num<99;num++) {
三.运行结果截图
实验六 三次自然样条插值算法
三次自然样条插值公式: P(x)=yk +S
’ k
(x-xk)+ S
’’ k
(x-xk) /2+( S
2
’’ k+1
-S
’’ k
)(x-xk) /(6hk)
3
其中 x∈[xk, xk+1]
一.参考算法
1.Input{ x0,y0,…,xn,yn} 2.For k=0,1,2,…,n-1 2.1 hk←xk+1-xk 3. a1←2*(h0+h1) 4. For k=2,3,…,n-1 4.1 ak←2*(hk-1+hk)-h k-1/ak-1 5. For k=1,2,…,n 5.1 ck←(yk-yk-1)/hk-1 6. For k=1,2,…,n-1 6.1 dk=6*(ck+1-ck) 7.b1←d1 8. For k=2,3,…,n-1 8.1 bk=dk-bk-1*hk-1/ak 9. S
实验四 拉格朗日插值算法
拉格朗日插值公式:
f ( x ) yk
k 0
n
x xi i 0 , i k xk xi
n
一.参考算法
1. Input{N,x0,y0,…,xn,yn} 2. Until 无新的 x 2.1 Input{x},S←0 2.2 For k=0,1,2,…,N 2.2. 1p←yk 2.2.2 For i=0,1,2,…,N