埃尔米特三次样条插值算法-JAVA版本实现
package math;
/**
* 三次样条插值
*
* y1=a+bx1+cx1^2
* y2=a+bx2+cx2^2
* y3=a+bx3+cx3^2
*
* (y1-y2)/(x1-x2)=b+c(x1^2-x2^2)/(x1-x2)
* (y2-y3)/(x2-x3)=b+c(x2^2-x3^2)/(x2-x3)
* (y1-y2)/(x1-x2)-(y2-y3)/(x2-x3)=c((x1^2-x2^2)/(x1-x2)-(x2^2-x3^2)/(x2-x3))
*
* c=[(y1-y2)/(x1-x2)-(y2-y3)/(x2-x3)]/((x1^2-x2^2)/(x1-x2)-(x2^2-x3^2)/(x2-x3))
* b=-c(x2^2-x3^2)/(x2-x3)+(y2-y3)/(x2-x3)
* a=y1-bx1-cx1^2
*
* @author zrh
* @date 2022-06-27
*/
public class Fx {
private double a;
private double b;
private double c;
private double x1, y1;
private double x2, y2;
private double x3, y3;
public Fx(double x1, double y1, double x2, double y2, double x3, double y3){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.x3 = x3;
this.y3 = y3;
getC();
getB();
getA();
}
public double getY(double x) {
double y = a + b * x + c * x * x;
return y;
}
private double getC() {
double aa = (y1-y2)/(x1-x2)-(y2-y3)/(x2-x3);
double bb = ((x1*x1-x2*x2)/(x1-x2)-(x2*x2-x3*x3)/(x2-x3));
c = aa/bb;
return c;
}
private double getB() {
double aa = (-c)*(x2*x2-x3*x3)/(x2-x3);
double bb = (y2-y3)/(x2-x3);
b = aa + bb;
return b;
}
private double getA() {
a = y1-b*x1-c*x1*x1;
return a;
}
}
调用方法为:
package math;
/**
* @author zrh
* @date 2022-06-16
*/
public class FxTest {
public static void main(String[] args) {
Fx fx = new Fx(70.0, 85.0, 74, 90, 81.0, 100.0);
double y = fx.getY(76);
System.out.println("x=76, y="+y);
//x=76, y=92.6948051948052
}
}