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

📄

📁 实现采用三弯矩法的三次样条插值
💻
字号:
/**
 * @(#)work2.java
 *
 * work2 application 分段二次多项式插值法
 *
 * @author 503所 马灵霞
 * @version 1.00 2008/12/4
 */
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.Graphics;
import java.awt.Container;
import javax.swing.JFrame;
import java.awt.Toolkit;
import java.awt.Image;
import java.awt.Dimension;
import javax.swing.JPanel;

class Method{
	static double sanWanJu(double x){
		double vectorX[]={0,4.74,9.50,19.00,38.00,57.00,76.00,95.00,114.00,133.00,152.00,171.00,190.00};
   		double vectorY[]={0.00,5.32,8.10,11.97,16.15,17.10,16.34,14.63,12.16,9.69,7.03,3.99,0.00};
   		double dcY0=1.12;
   		double dcYn=-0.22;
   		double vectorH[]=new double[vectorX.length];
   		double vectorA[]=new double[vectorX.length-1];
   		double vectorR[]=new double[vectorX.length-1];
   		double vectorB[]=new double[vectorX.length];
   		double matrixA[][]=new double[vectorX.length][vectorX.length];
   		double vectorM[]=new double[vectorX.length];
   		vectorH[0]=0;
		for(int i=1;i<=vectorH.length-1;i++){
			vectorH[i]=vectorX[i]-vectorX[i-1];
		}//求 vectorH
		
   		vectorA[0]=1;
   		for(int i=1;i<=vectorA.length-1;i++){
   			vectorA[i]=vectorH[i+1]/(vectorH[i]+vectorH[i+1]);
   			vectorR[i-1]=1-vectorA[i];
   		}
   		vectorR[vectorR.length-1]=1;//vectorA,vectorR
   		vectorB[0]=-6/vectorH[1]*((vectorY[1]-vectorY[0])/vectorH[1]-dcY0);
   		for(int i=1;i<=vectorB.length-2;i++){
   			vectorB[i]=6/(vectorH[i]+vectorH[i+1])*((vectorY[i+1]-vectorY[i])/vectorH[i+1]-(vectorY[i]-vectorY[i-1])/vectorH[i]);
   		}
   		vectorB[12]=-6/vectorH[12]*(dcYn-(vectorY[12]-vectorY[11])/vectorH[12]);//vectorB

   		for(int i=0;i<=matrixA.length-1;i++){
   			matrixA[i][i]=2;
   		}
   		for(int i=0;i<=matrixA.length-2;i++){
   			matrixA[i][i+1]=vectorA[i];
   			matrixA[i+1][i]=vectorR[i];
   		}//matrixA

   		//用追赶 法 求解方程 matrixA*vectorM=vectorB;
   		double matrixL[][]=new double[matrixA.length][matrixA.length];
   		double matrixU[][]=new double[matrixA.length][matrixA.length];
   		double y[]=new double[matrixA.length];
   		matrixL[0][0]=matrixA[0][0];
   		for(int i=0;i<=matrixA.length-2;i++){
   			matrixU[i][i+1]=matrixA[i][i+1]/matrixL[i][i];
   			matrixL[i+1][i+1]=matrixA[i+1][i+1]-matrixA[i+1][i]*matrixU[i][i+1];
   		}
   		y[0]=vectorB[0]/matrixL[0][0];
   		for(int i=1;i<=matrixA.length-1;i++){
   			y[i]=(vectorB[i]-matrixA[i][i-1]*y[i-1])/matrixL[i][i];
   		}
   		vectorM[matrixA.length-1]=y[matrixA.length-1];
   		for(int i=matrixA.length-2;i>=0;i--){
   			vectorM[i]=y[i]-matrixU[i][i+1]*vectorM[i+1];
   		}
   		
   		//for(int i=0;i<=x.length-1;i++){
   			if(x>vectorX[0]&&x<vectorX[1]){
   				return vectorM[0]/6/vectorH[1]*Math.pow((vectorX[1]-x),3)+vectorM[1]/6/vectorH[1]*Math.pow((x-vectorX[0]),3)+(vectorY[0]/vectorH[1]-vectorM[0]*vectorH[1]/6)*(vectorX[1]-x)+(vectorY[1]/vectorH[1]-vectorM[1]*vectorH[1]/6)*(x-vectorX[0]);
   			}
   			if(x>=vectorX[1]&&x<vectorX[2]){
   				return vectorM[1]/6/vectorH[2]*Math.pow((vectorX[2]-x),3)+vectorM[2]/6/vectorH[2]*Math.pow((x-vectorX[1]),3)+(vectorY[1]/vectorH[2]-vectorM[1]*vectorH[2]/6)*(vectorX[2]-x)+(vectorY[2]/vectorH[2]-vectorM[2]*vectorH[2]/6)*(x-vectorX[1]);
   			}
   			if(x>=vectorX[2]&&x<vectorX[3]){
   				return vectorM[2]/6/vectorH[3]*Math.pow((vectorX[3]-x),3)+vectorM[3]/6/vectorH[3]*Math.pow((x-vectorX[2]),3)+(vectorY[2]/vectorH[3]-vectorM[2]*vectorH[3]/6)*(vectorX[3]-x)+(vectorY[3]/vectorH[3]-vectorM[3]*vectorH[3]/6)*(x-vectorX[2]);
   			}
   			if(x>=vectorX[3]&&x<vectorX[4]){
   				return vectorM[3]/6/vectorH[4]*Math.pow((vectorX[4]-x),3)+vectorM[4]/6/vectorH[4]*Math.pow((x-vectorX[3]),3)+(vectorY[3]/vectorH[4]-vectorM[3]*vectorH[4]/6)*(vectorX[4]-x)+(vectorY[4]/vectorH[4]-vectorM[4]*vectorH[4]/6)*(x-vectorX[3]);
   			}
   			if(x>=vectorX[4]&&x<vectorX[5]){
   				return vectorM[4]/6/vectorH[5]*Math.pow((vectorX[5]-x),3)+vectorM[5]/6/vectorH[5]*Math.pow((x-vectorX[4]),3)+(vectorY[4]/vectorH[5]-vectorM[4]*vectorH[5]/6)*(vectorX[5]-x)+(vectorY[5]/vectorH[5]-vectorM[5]*vectorH[5]/6)*(x-vectorX[4]);
   			}
   			if(x>=vectorX[5]&&x<vectorX[6]){
   				return vectorM[5]/6/vectorH[6]*Math.pow((vectorX[6]-x),3)+vectorM[6]/6/vectorH[6]*Math.pow((x-vectorX[5]),3)+(vectorY[5]/vectorH[6]-vectorM[5]*vectorH[6]/6)*(vectorX[6]-x)+(vectorY[6]/vectorH[6]-vectorM[6]*vectorH[6]/6)*(x-vectorX[5]);
   			}
   			if(x>=vectorX[6]&&x<vectorX[7]){
   				return vectorM[6]/6/vectorH[7]*Math.pow((vectorX[7]-x),3)+vectorM[7]/6/vectorH[7]*Math.pow((x-vectorX[6]),3)+(vectorY[6]/vectorH[7]-vectorM[6]*vectorH[7]/6)*(vectorX[7]-x)+(vectorY[7]/vectorH[7]-vectorM[7]*vectorH[7]/6)*(x-vectorX[6]);
   			}
   			if(x>=vectorX[7]&&x<vectorX[8]){
   				return vectorM[7]/6/vectorH[8]*Math.pow((vectorX[8]-x),3)+vectorM[8]/6/vectorH[8]*Math.pow((x-vectorX[7]),3)+(vectorY[7]/vectorH[8]-vectorM[7]*vectorH[8]/6)*(vectorX[8]-x)+(vectorY[8]/vectorH[8]-vectorM[8]*vectorH[8]/6)*(x-vectorX[7]);
   			}
   			if(x>=vectorX[8]&&x<vectorX[9]){
   				return vectorM[8]/6/vectorH[9]*Math.pow((vectorX[9]-x),3)+vectorM[9]/6/vectorH[9]*Math.pow((x-vectorX[8]),3)+(vectorY[8]/vectorH[9]-vectorM[8]*vectorH[9]/6)*(vectorX[9]-x)+(vectorY[9]/vectorH[9]-vectorM[9]*vectorH[9]/6)*(x-vectorX[8]);
   			}
   			if(x>=vectorX[9]&&x<vectorX[10]){
   				return vectorM[9]/6/vectorH[10]*Math.pow((vectorX[10]-x),3)+vectorM[10]/6/vectorH[10]*Math.pow((x-vectorX[9]),3)+(vectorY[9]/vectorH[10]-vectorM[9]*vectorH[10]/6)*(vectorX[10]-x)+(vectorY[10]/vectorH[10]-vectorM[10]*vectorH[10]/6)*(x-vectorX[9]);
   			}
   			if(x>=vectorX[10]&&x<vectorX[11]){
   				return vectorM[10]/6/vectorH[11]*Math.pow((vectorX[11]-x),3)+vectorM[11]/6/vectorH[11]*Math.pow((x-vectorX[10]),3)+(vectorY[10]/vectorH[11]-vectorM[10]*vectorH[11]/6)*(vectorX[11]-x)+(vectorY[11]/vectorH[11]-vectorM[11]*vectorH[11]/6)*(x-vectorX[10]);
   			}
   			if(x>=vectorX[11]&&x<vectorX[12]){
   				return vectorM[11]/6/vectorH[12]*Math.pow((vectorX[12]-x),3)+vectorM[12]/6/vectorH[12]*Math.pow((x-vectorX[11]),3)+(vectorY[11]/vectorH[12]-vectorM[11]*vectorH[12]/6)*(vectorX[12]-x)+(vectorY[12]/vectorH[12]-vectorM[12]*vectorH[12]/6)*(x-vectorX[11]);
   			}
   			else{
   				return 0;
   			}
   		//}
	}
} 
class BlankFrame extends JFrame{
	private static final int WIDTH=1200;
	private static final int HEIGHT=200;
	public BlankFrame(){
		Container con=getContentPane();
		setSize(WIDTH,HEIGHT);
		setTitle("三次样条插值");
		setLocation(10,10);
		StringPanel panel=new StringPanel();
		con.add(panel);
	}
}
class StringPanel extends JPanel{
	public static final double WIDTH=1200;
	public static final double HEIGHT=200;
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		Graphics2D g2=(Graphics2D)g;
		double vectorX[]={0,4.74,9.50,19.00,38.00,57.00,76.00,95.00,114.00,133.00,152.00,171.00,190.00};
    	double vectorF[]={0.00,5.32,8.10,11.97,16.15,17.10,16.34,14.63,12.16,9.69,7.03,3.99,0.00};
		Line2D.Double lineX=new Line2D.Double(0,100,1000.00,100.00);
		g2.draw(lineX);
		g2.drawString("x",1000,90);
		Line2D.Double lineY=new Line2D.Double(0,100,0,0);
		g2.draw(lineY);
		g2.drawString("y",10,10);
    	for(int i=0;i<=11;i++){
    		g2.drawString("。",(float)vectorX[i]*5,100-(float)vectorF[i]*5);
    	}
    	double i=0;
    	do{
    		g2.drawString(".",(float)i*5,100-(float)Method.sanWanJu(i)*5);
    		i=i+0.2;
    	}while(i<=190);
	}
}

public class work4 {
    
    public static void main(String[] args) {
    	System.out.println("用三次样条插值法细化后的全部数据为:");
    	for(int i=0;i<=190;i++){
    		System.out.println("坐标x为	"+i+"	时,y为:	"+Method.sanWanJu(i));
    	}
    	BlankFrame frame=new BlankFrame();
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.show();

    }
}

⌨️ 快捷键说明

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