数值计算 第三章Word格式.docx
- 文档编号:19647016
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:28
- 大小:100.52KB
数值计算 第三章Word格式.docx
《数值计算 第三章Word格式.docx》由会员分享,可在线阅读,更多相关《数值计算 第三章Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
publicintgetSize(){
returnthis.size;
voidSetSize(intsize){
publicdouble[][]getData(){
returnthis.data;
publicdoubleinterpolation(doublex){
doubletemp=1d;
doublesum=0d;
for(inti=0;
i<
this.size;
i++){
for(intj=0;
j<
j++){
if(i!
=j){
temp*=(x-data[j][0])/(data[i][0]-data[j][0]);
}
}
sum+=(temp*data[i][1]);
temp=1d;
}
returnsum;
publicvoidprint(){
System.out.print("
X"
);
System.out.print(data[i][0]+"
"
System.out.println();
y=f(x)"
System.out.print(data[i][1]+"
}//Program3_1
*Lagrange插值法测试
publicclassTestProgram3_1{
publicstaticvoidmain(String[]args){
double[][]data=newdouble[][]{{144,12},{169,13},{225,15}};
Program3_1a=newProgram3_1(data,3);
a.print();
System.out.println("
测试f(175)="
+a.interpolation(175));
}
运行结果:
/**
*@author邓仕军
*@time2012-04-28
*@version0.1
*Newton插值法:
*此程序parameter是不必要的,因为完全可以在data这个二维数组中保存求得的a1,a2,...,an,
*但是这样也将data中的数据覆盖了,如果一旦后人需要这个数据(我们无法保证使用这个对象的
*人不会提出要使用data的要求),将回天无术。
因此,在本版本中我将使用一个parameter一维
*数组保存a1,a2,...,an,从而使得data中的数据得以保存下来,在下一个版本中,我将只使用
*data这个二维数组,实现同样的功能
classProgram3_2{
privatedouble[][]data;
//给定用来算均差的列表
//data值的对数
privatedouble[]parameter;
//参数
publicProgram3_2(){
publicProgram3_2(doubledata[][],intsize){
this.parameter=newdouble[size];
//求参数
for(inti=this.getSize()-1;
i>
=0;
i--){
if(i==0){
this.parameter[0]=this.getData()[0][1];
}else{
this.parameter[i]=(this.getData()[i][1]-this.getData()[i-1][1])
/(this.getData()[i][0]-this.getData()[i-1][0]);
for(inti=2;
this.getSize();
for(intj=this.getSize()-1;
j>
=i;
j--){
this.parameter[j]=(this.getParameter()[j]-this
.getParameter()[j-1])
/(this.getData()[j][0]-this.getData()[j-i][0]);
publicdouble[]getParameter(){
returnthis.parameter;
doublefunction(doublex){
for(inti=this.getSize()-2;
=1;
if(i==this.getSize()-2){
sum+=((x-this.getData()[i-1][0])*this.getParameter()[i]+this
.getParameter()[i-1]);
sum*=(x-this.getData()[i-1][0]);
sum+=this.getParameter()[i-1];
}//function
//可以看到,证实因为data中数据得以保存,在这里实现打印这个函数式多么的方便
}//Program3_2
*@version0.2
*Newton插值法:
不用parameter,仅仅使用data这个二维数组,保存系a1,a2...,an,这样确实节约了空间,
*但在后面如果需要使用data中数据,就非常不方便了.因此,我并不认为这是一种比版本0.1明智的做法
this.print();
//因为data中的数据会被破坏,因此print就只有放在这里,才能让用户看到正在本该属于data的数据
//(事实上现在的print函数也因为data的改变,并不能再提供我们所希望的打印功能)
//放在这里显然不符合面向对象理念,但在本程序中也没多大关系
for(inti=1;
this.data[j][1]=(this.data[j][1]-this.data[j-1][1])
/(this.data[j][0]-this.data[j-i][0]);
sum+=((x-this.getData()[i-1][0])*this.getData()[i][1]+this
.getData()[i-1][1]);
sum+=this.getData()[i-1][1];
publicclassTestProgram3_2{
publicstaticvoidmain(String[]args){
double[][]data=newdouble[][]{{144,12},{169,13},{225,15}};
intsize=3;
Program3_2a=newProgram3_2(data,size);
System.out.println("
+a.function(175));
-----------------------------------"
data=newdouble[][]{{0.4,0.41075},{0.55,0.57815},{0.65,0.69675},{0.80,0.88811}};
size=4;
a.setData(data,size);
测试f(0.596)="
+a.function(0.596));
data=newdouble[][]{{0.80,0.88811},{0.90,1.02652},{1.05,1.25382}};
size=3;
测试f(0.955)="
+a.function(0.955));
}
*@author邓仕军
*@version0.1
*@time2012-05-03
*Hermite插值
classHermite{
Derivativeder;
//导数类
//传进来的数据
privatedouble[]a_x;
//α(x)
privatedouble[]b_x;
//β(x)
privateintcount;
publicHermite(){
publicHermite(doubledata[][],intsize){
this.count=0;
this.a_x=newdouble[size];
this.b_x=newdouble[size];
try{
der=newDerivative(this,this.getClass().getDeclaredMethod("
fX"
double.class));
}catch(NoSuchMethodException|SecurityExceptione){
e.printStackTrace();
}//init(....);
count=i;
//L(x)确定下标i
a_x[i]=(1-2*(x-this.getData()[i][0])
*der.getDerivative(this.getData()[i][0]))
*lX(i,x)*lX(i,x);
b_x[i]=(x-this.getData()[i][0])*lX(i,x)*lX(i,x);
//求值
sum+=this.a_x[i]*this.getData()[i][1];
sum+=this.b_x[i]*this.getData()[i][2];
/*
*被求导的函数
doublefX(doublex){
returnlX(count,x);
*L(X),k为下标
doublelX(intk,doublex){
doublesum=1d;
if(i!
=k){
sum*=(x-data[i][0])/(data[k][0]-data[i][0]);
System.out.printf("
%8s"
"
i:
"
System.out.printf("
%12s"
i);
System.out
.println("
\n----------------------------------------------------------------------------"
X"
%12.5f"
data[i][0]);
y=f(x)"
data[i][1]);
y=f'
(x)"
data[i][2]);
α(x)"
a_x[i]);
β(x)"
b_x[i]);
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
*Derivative:
求一个函数的导数,运用反射机制
classDerivative{
Methodmethod;
Objectobj;
publicDerivative(Objectobj,Methodf){
this.method=f;
this.obj=obj;
strictfpdoublegetDerivative(doublex){
doublederiva1=0d,deriva2=0d;
booleanflag=true;
doubleDx=0.0001;
//增量△X
finaldoubleprecision=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值计算 第三章 数值 计算 第三