插值算法
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(); } }
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); }
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++) {
求 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}
//显示前 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); } }
插值算法
实验目的
通过上机实现拉格朗日、牛顿和三次自然样条三种插值算法,了解并掌握 拉格朗日、牛顿和三次自然样条三种插值算法的内涵。通过动态演示曲线生成 全过程,分析并比较三种插值算法的优缺点,深刻理解这些算法。
实验内容与要求
已知 f(xn)=yn ,n=0,1,2,…,N;求通过这 N+1 个节点{(xn,yn)| n=0,1,2,…,N } 的插值函数 Pn (x)。 设计出具体的程序,分别使用拉格朗日插值,牛顿插值和 三次自然样条三种算法绘制出相应的插值曲线。 用三条不同颜色的曲线来表示三 种插值方法在一段区间内的插值函数。要求动态显示曲线绘制全过程。
三.运行结果截图
实验六 三次自然样条插值算法
三次自然样条插值公式: 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
{ 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); } }