⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 insert.java

📁 牛顿、拉格朗日、三次自然插值的演示文件。
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
/**
 * 
 *
 * @author  bobo
 * @version 1.00 04/11/04
 */
  
public class insert{
	public static int X[]=new int[20],Y[]=new int[20];
    public static int i=0,f;
    public static void main(String args[]){
           Frame f=new Frame("三种插值算法");
           Panel p1=new Panel();
           Panel p2=new Panel();
           Panel p3=new Panel();
           Button b4=new Button("拉格朗日插值");
           Button b5=new Button("牛顿插值");
           Button b6=new Button("三次自然样条插值");
           Button b7=new Button("CLEAN");
           Listener1 bh1=new Listener1(f);
           Listener2 bh2=new Listener2(p1);
           Listener3 bh3=new Listener3(p1);
           Listener4 bh4=new Listener4(p1);
           Listener5 bh5=new Listener5(p1);
           Listener6 bh6=new Listener6(p1);
           f.addWindowListener(bh1);
           p1.addMouseListener(bh2);
           b4.addActionListener(bh3);
           b5.addActionListener(bh4);
           b6.addActionListener(bh5);
           b7.addActionListener(bh6);
           p2.add(b4);
           p2.add(b5);
           p2.add(b6);
           p2.add(b7);
           p2.setBackground(Color.yellow);
           p3.setBackground(Color.yellow);
           f.add(p1,"Center");
           f.add(p2,"North");
           f.add(p3,"South");
           f.setSize(800,600);
           f.setVisible(true);                                                     
           }
     }                 
 class Listener1 extends WindowAdapter{         //关闭窗口的监视器。
    Listener1(Frame f){
             this.f=f;
             }
    private Frame f;
    public void windowClosing(WindowEvent e){
             System.exit(0);
             }   
   }                       //用鼠标点出任意个点,获得他们的坐标,并在图中表出来. 
   
 class Listener2 extends MouseAdapter{
   Listener2(Panel p1){	
            this.p1=p1;
            }
   private Panel p1;
   public void mouseClicked(MouseEvent e){
               insert.X[insert.i]=e.getX();
               insert.Y[insert.i]=e.getY();
               p1.getGraphics().drawString("x",e.getX()-1,e.getY()+3);
               insert.i++;
               }

   }    
 class Listener3 implements ActionListener{     //拉格朗日插植算法连线。
       Listener3(Panel p1){
                   this.p1=p1;
                  }
      private Panel p1;
      private int b,j,int_s,k;
      private double double_y,s,xn,xm;
      public void actionPerformed(ActionEvent e){
          for(b=insert.X[0]+1;b<=insert.X[insert.i-1];b++){ 
                    s=0;
                    for(k=0;k<=(insert.i-1);k++){
                        double_y=(double)insert.Y[k];
                        for(j=0;j<=(insert.i-1);j++){
                             xm=(double)insert.X[j];
                             xn=(double)insert.X[k];
                             if(j!=k)   
                             double_y=double_y*(b-xm)/(xn-xm);
                             }
                        s=s+double_y;
                        }
                        int_s=(int)s;
                        Graphics g=p1.getGraphics();
                        g.setColor(Color.blue);
                        for(j=0;j<100000;j++);
	                    g.drawString(".",b,int_s);g.drawString("拉格朗日插值",5,15);
                     }
           }                       
       }     

 class Listener4 implements ActionListener{           //牛顿插值算法连线
       Listener4(Panel p1){
               this.p1=p1;
               }
      private Panel p1;
      private int j,k,int_p,b;
      private double d[]=new double[20];
      private double double_X[]=new double[20];
      private double p;
      public void actionPerformed(ActionEvent e){       //计算牛顿插值算法中的系数d[i]。
          for(j=0;j<=(insert.i-1);j++){
                  d[j]=(double)insert.Y[j];
                  double_X[j]=(double)insert.X[j];
                  }
          for(k=1;k<=(insert.i-1);k++){
          for(j=(insert.i-1);j>=k;j--) d[j]=(d[j]-d[j-1])/(double_X[j]-double_X[j-k]);
          }       
          for(b=insert.X[0]+1;b<=insert.X[insert.i-1];b++){
                p=d[insert.i-1];for(j=(insert.i-2);j>=0;j--) p=d[j]+p*(b-double_X[j]);
                int_p=(int)p;
                Graphics g=p1.getGraphics();
                g.setColor(Color.black);
                for(j=0;j<100000;j++); 
                g.drawString(".",b,int_p);g.drawString("牛顿插值",5,30);
               }
          }
     }      
 class Listener5 implements ActionListener{            //三次自然样条插值算法连线。
       Listener5(Panel p1){
                 this.p1=p1;
                 }
       private Panel p1;
       private double a[]=new double[20];
       private double b[]=new double[20];
       private double c[]=new double[20];
       private double d[]=new double[20];
       private double h[]=new double[20];
       private double s2[]=new double[20];             
       private int int_s,j,k;                         
       private double s,s1;                             
       public void actionPerformed(ActionEvent e){
       for(j=0;j<(insert.i-1);j++){
          h[j]=insert.X[j+1]-insert.X[j];                                      
          }
       a[1]=2*(h[0]+h[1]);
       for(j=2;j<(insert.i-1);j++){
           a[j]=2*(h[j-1]+h[j])-h[j+1]*h[j+1]/a[j-1];                           
          }
       for(j=1;j<insert.i;j++){
           c[j]=(insert.Y[j]-insert.Y[j-1])/h[j-1];                             
          }
       for(j=1;j<(insert.i-1);j++){
           d[j]=6*(c[j+1]-c[j]);
          }
       b[1]=d[1];
       for(j=2;j<(insert.i-1);j++){
           b[j]=d[j]-b[j-1]*h[j-1]/a[j-1];                                        
          }
       s2[insert.i-2]=b[insert.i-2]/a[insert.i-2];
       for(j=(insert.i-3);j>0;j--){
           s2[j]=(b[j]-h[j]*s2[j+1])/a[j];                                      
          }
       s2[0]=0;s2[insert.i-1]=0;
           for(j=0;j<(insert.i-1);j++){
               insert.f=insert.X[j]; 
               while(insert.f<=insert.X[j+1]){
                 	CalculateS(j);}
              }
       }
        void CalculateS(int k){
                      s1=c[k+1]-s2[k+1]*h[k]/6-s2[k]*h[k]/3;
                      s=insert.Y[k]+s1*(insert.f-insert.X[k])+s2[k]*(insert.f-insert.X[k])*(insert.f-insert.X[k])/2+(s2[k+1]-s2[k])*((insert.f-insert.X[k])*(insert.f-insert.X[k])*(insert.f-insert.X[k]))/(6*h[k]);
                      int_s=(int)s;
                      Graphics g=p1.getGraphics();
                      g.setColor(Color.red);
                      g.drawString(".",insert.f,int_s);
                      for(int j=0;j<100000;j++);
                      g.drawString("三次自然样条插值", 5, 45);
                      insert.f++;
                      }
     }
      
 


class Listener6 implements ActionListener{
	  Listener6(Panel p1){
		    this.p1=p1;
	        }
	  private Panel p1;
	  public void actionPerformed(ActionEvent e){
		     p1.repaint();
             for(int i=0;i<20;i++){
                   insert.X[i]=0;insert.Y[i]=0;
                   }
             insert.f=0;insert.i=0;
             }
      }







































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -