- 论坛徽章:
- 0
|
/**
* @(#)Hermite.java
*
*
* @author 坚持到底
* @version 1.00
*/
public class Hermite
{
private double[] x;
private double[] y;
private double[] m;
private int n;
/**
* 构造函数
* @param x 节点x
* @param y 节点x所对应的函数值
* @param m y所对应的导数值
* @param n 节点的个数
*/
Hermite(double[] x, double[] y, double[] m, int n)
{
this.x = x;
this.y = y;
this.m = m;
this.n = n;
}
/**
* @param x0
* @return x0处所对应的Hermite插值的值
*/
public double calHermite(double x0)
{
double HermiteValue = 0.0;
int j;
for (j = 0; j n; j++)
HermiteValue += y[j] * a(j, x0) + m[j] * b(j, x0);
return HermiteValue;
}
public double a(int j, double x0)
{
double value = 0.0;
double sum = 0.0;
int k;
for (k = 0; k n; k++)
{
if (k == j)
continue;
else
{
sum += (1.0 / (x[j] - x[k]));
}
}
value = (1-2 * (x0 - x[j]) * sum) * l(j, x0) * l(j, x0);
return value;
}
public double b(int j, double x0)
{
double value = 0.0;
value = (x0 - x[j]) * l(j, x0) * l(j, x0);
return value;
}
/**
* Lagrange插值基函数
*/
public double l(int j, double x0)
{
double value = 1;
int i;
for (i = 0; i n; i++)
{
if (i == j)
continue;
else
{
value *= (x0 - x) / (x[j] - x);
}
}
return value;
}
public static void main(String[] args)
{
double[] x={0.10,0.15,0.30,0.45,0.55,0.60,0.70,0.85,0.9,1.0};
double[] y={0.904837,0.860708,0.740818,0.637628,0.576950,0.548812,0.496585,0.427415,0.406570,0.367879};
double[] m={-0.904837,-0.860708,-0.740818,-0.637628,-0.576950,-0.548812,-0.496585,-0.427415,-0.406570,-0.367879};
int n = 10;
double x0 = 0.356;
Hermite h = new Hermite(x, y, m, n);
System.out.println("f(" + x0 + ")=" + h.calHermite(x0));
}
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/40668/showart_454117.html |
|