「java插值算法」常用的插值算法
本篇文章给大家谈谈java插值算法,以及常用的插值算法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
插值法的原理是什么,怎么计算?
插值法原理:
数学内插法即“直线插入法”。
其原理是,若A(i1‚1)‚B(i2‚2)为两点,则点P(i‚)在上述两点确定的直线上。而工程上常用的为i在i1‚i2之
注意:
(1)“内插法”的原理是根据等比关系建立一个方程,然后解方程计算得出所要求的数据。例如:假设与A1对应的数据是B1,与A2对应的数据是B2,A介于A1和A2之间,已知与A对应的数据是B,则可以按照(A1-A)/(A1-A2)=(B1-B)/(B1-B2)计算得出A的数值。
(2)仔细观察一下这个方程会看出一个特点,即相对应的数据在等式两方的位置相同。例如:A1位于等式左方表达式的分子和分母的左侧,与其对应的数字B1位于等式右方的表达式的分子和分母的左侧。
(3)还需要注意的一个问题是:如果对A1和A2的数值进行交换,则必须同时对B1和B2的数值也交换,否则,计算得出的结果一定不正确。
扩展资料:
若函数f(x)在自变数x一些离散值所对应的函数值为已知,则可以作一个适当的特定函数p(x),使得p(x)在这些离散值所取的函数值,就是f(x)的已知值。从而可以用p(x)来估计f(x)在这些离散值之间的自变数所对应的函数值,这种方法称为插值法。
如果只需要求出某一个x所对应的函数值,可以用“图解内插”。它利用实验数据提供要画的简单曲线的形状,然后调整它,使得尽量靠近这些点。
如果还要求出因变数p(x)的表达式,这就要用“表格内插”。通常把近似函数p(x)取为多项式(p(x)称为插值多项式),最简单的是取p(x)为一次式,即线性插值法。在表格内插时,使用差分法或待定系数法(此时可以利用拉格朗日公式)。在数学、天文学中,插值法都有广泛的应用。
参考资料:百度百科-插值法
用Java实现牛顿插值 求大神帮下
class Lagrange
{
public static double esitimate(double x,int n,double k[][])
{
double y=0;
int i;
int j;
double w;
double w1;
for(i=0;in;i++)
{
w=1;
w1=1;
for(j=0;jn;j++)
{
if(j==i)
continue;
else
{
w=w*(x-k[j][0]);
w1=w1*(k[i][0]-k[j][0]);
}
}
//System.out.printf("y=%f,w=%f,w1=%f\n",k[i][1],w,w1);
y=y+k[i][1]*w/w1;
}
return y;
}
}
class Newton
{
double ad[][];//均差表
int n;
Newton(int n,double k[][])
{
int i,j;
this.n=n;
ad=new double[n][n];
for(i=0;in;i++)
ad[i][0]=k[i][1];
for(i=1;in;i++)
ad[i][1]=(ad[i][0]-ad[i-1][0])/(k[i][0]-k[i-1][0]);
for(i=2;in;i++)
for(j=i;jn;j++)
{
ad[j][i]=(ad[j][i-1]-ad[j-1][i-1])/(k[j][0]-k[j-i][0]);
//System.out.printf("%f %f %f %f\n", ad[j][i-1],ad[j-1][i-1],k[j][0],k[j-i][0]);
}
show();
}
void update(double x,double y,double k[][])
{
int i,j;
n++;
k[n-1][0]=x;
k[n-1][1]=y;
double temp[][]=new double[n][n];
for(i=0;in-1;i++)
for(j=0;j=i;j++)
temp[i][j]=ad[i][j];
temp[n-1][0]=y;
for(i=1;in;i++)
temp[n-1][i]=(temp[n-1][i-1]-temp[n-2][i-1])/(x-k[n-1-i][0]);
ad=temp;
show();
}
void show()
{
int i,j;
System.out.println("均差计算可列均差表如下:");
for(i=0;in;i++)
{
for(j=0;j=i;j++)
System.out.printf("%f ", ad[i][j]);
System.out.printf("\n");
}
System.out.println("*******************************************");
}
double esitimate(double x,double k[][])
{
int i,j;
double y=ad[0][0];
double w;
for(i=1;in;i++)
{
w=ad[i][i];
for(j=0;ji;j++)
w=w*(x-k[j][0]);
y=y+w;
}
return y;
}
}
public class interpolate
{
public static void main(String args[])
{
int n=20;
double k[][]=new double[n][2];
int i;
n=3;
k[0][0]=0.32;
k[0][1]=0.314567;
k[1][0]=0.34;
k[1][1]=0.333487;
k[2][0]=0.36;
k[2][1]=0.352274;
System.out.println("拉格朗日插值的节点:");
for(i=0;in;i++)
System.out.printf("%f %f\n", k[i][0],k[i][1]);
System.out.println("估算0.3367处的函数值:");
n=2;
System.out.printf("采用%d次插值得:%f\n",n-1,Lagrange.esitimate(0.3367,n,k));
n=3;
System.out.printf("采用%d次插值得:%f\n",n-1,Lagrange.esitimate(0.3367,n,k));
System.out.println("*******************************************");
k[0][0]=0.4;
k[0][1]=0.41075;
k[1][0]=0.55;
k[1][1]=0.57815;
k[2][0]=0.65;
k[2][1]=0.69675;
k[3][0]=0.80;
k[3][1]=0.88811;
k[4][0]=0.90;
k[4][1]=1.02652;
k[5][0]=1.05;
k[5][1]=1.25382;
Newton nt=new Newton(3,k);
nt.update(0.80, 0.88811, k);
nt.update(0.90, 1.02652, k);
nt.update(1.05, 1.25382, k);
nt=new Newton(5,k);
System.out.println("估算0.596处的函数值:");
System.out.printf("%f",nt.esitimate(0.596, k));
}
}
java 图像放大
其实,这个算法老复杂了。
最近像素插值算法是最简单的一种插值算法,当图片放大时,缺少的像素通过直接使用与之最接近的原有的像素的颜色生成,也就是说照搬旁边的像素。它是三种内插值方式中质量最差的一种,用该方法修改后的图像边缘有锯齿,但速度较快。
双线性插值算法是沿水平和垂直方向对周围像素取样,然后建立像素颜色总数的平均颜色值。这种算法极大地消除了锯齿现象,在计算速度与质量两个方面都居于三种方法中间地位。
双立方插值算法是在水平、垂直和对角线方向对像素取样,然后使用总颜色的加权平均值建立新像素,它是三者中运算速度最慢,但效果最佳的一种。
java插值算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于常用的插值算法、java插值算法的信息别忘了在本站进行查找喔。
发布于:2022-11-21,除非注明,否则均为
原创文章,转载请注明出处。