1、数值计算 第三章/* * author:邓仕军 * time:2012-04-26 * Lagrange插值法 */publicclass Program3_1 privatedoubledata; privateintsize; public Program3_1() init(); public Program3_1(double data, int size) init(data, size); voidinit(double data, int size) this.data = data; this.size = size; voidinit() this.data = newdou
2、ble ; this.size = 0; voidsetData(double data, int size) this.data = data; this.size = size; publicintgetSize() returnthis.size; voidSetSize(int size) this.size = size; publicdouble getData() returnthis.data; publicdouble interpolation(double x) double temp = 1d; double sum = 0d; for (inti = 0; ithis
3、.size; i+) for (int j = 0; j this.size; j+) if (i != j) temp *= (x - dataj0) / (datai0 - dataj0); sum += (temp * datai1); temp = 1d; return sum; publicvoid print() System.out.print(X ); for (inti = 0; ithis.size; i+) System.out.print(datai0 + ); System.out.println(); System.out.print(y=f(x) ); for (
4、inti = 0; i= 0; i-) if (i = 0) this.parameter0 = this.getData()01; else this.parameteri = (this.getData()i1 - this.getData()i - 11) / (this.getData()i0 - this.getData()i - 10); for (inti = 2; i= i; j-) this.parameterj = (this.getParameter()j - this .getParameter()j - 1) / (this.getData()j0 - this.ge
5、tData()j - i0); voidinit() this.data = newdouble ; this.size = 0; this.parameter = newdoublesize; voidsetData(double data, int size) init(data, size); publicintgetSize() returnthis.size; publicdouble getData() returnthis.data; publicdouble getParameter() returnthis.parameter; double function(double
6、x) double sum = 0d; for (inti = this.getSize() - 2; i= 1; i-) if (i = this.getSize() - 2) sum += (x - this.getData()i - 10) * this.getParameter()i + this .getParameter()i - 1); else sum *= (x - this.getData()i - 10); sum += this.getParameter()i - 1; return sum; / function publicvoid print() / 可以看到,证
7、实因为data中数据得以保存,在这里实现打印这个函数式多么的方便 System.out.print(X ); for (inti = 0; ithis.size; i+) System.out.print(datai0 + ); System.out.println(); System.out.print(y=f(x) ); for (inti = 0; ithis.size; i+) System.out.print(datai1 + ); System.out.println(); / Program3_2/* * author邓仕军 * time 2012-04-28 * version
8、0.2 * Newton插值法:不用parameter,仅仅使用data这个二维数组,保存系a1,a2.,an,这样确实节约了空间, * 但在后面如果需要使用data中数据,就非常不方便了.因此,我并不认为这是一种比版本0.1明智的做法 */class Program3_2 privatedouble data;/ 给定用来算均差的列表 privateintsize;/ data值的对数 public Program3_2() init(); public Program3_2(double data, int size) init(data, size); voidinit(double d
9、ata, int size) this.data = data; this.size = size; this.print(); / 因为data中的数据会被破坏,因此print就只有放在这里,才能让用户看到正在本该属于data的数据 /(事实上现在的print函数也因为data的改变,并不能再提供我们所希望的打印功能) /放在这里显然不符合面向对象理念,但在本程序中也没多大关系 for (inti = 1; i= i; j-) this.dataj1 = (this.dataj1 - this.dataj - 11) / (this.dataj0 - this.dataj - i0); vo
10、idinit() this.data = newdouble ; this.size = 0; voidsetData(double data, int size) init(data, size); publicintgetSize() returnthis.size; publicdouble getData() returnthis.data; double function(double x) double sum = 0d; for (inti = this.getSize() - 2; i= 1; i-) if (i = this.getSize() - 2) sum += (x
11、- this.getData()i - 10) * this.getData()i1 + this .getData()i - 11); else sum *= (x - this.getData()i - 10); sum += this.getData()i - 11; return sum; / function publicvoid print() System.out.print(X ); for (inti = 0; ithis.size; i+) System.out.print(datai0 + ); System.out.println(); System.out.print
12、(y=f(x) ); for (inti = 0; ithis.size; i+) System.out.print(datai1 + ); System.out.println(); / Program3_2publicclass TestProgram3_2 publicstaticvoid main(String args) double data =newdouble144,12,169,13,225,15; int size=3; Program3_2 a=new Program3_2(data,size); System.out.println(测试f(175)=+a.functi
13、on(175); System.out.println(-); data =newdouble0.4,0.41075,0.55,0.57815,0.65,0.69675,0.80,0.88811; size=4; a.setData(data, size); System.out.println(测试f(0.596)=+a.function(0.596); System.out.println(-); data =newdouble0.80,0.88811,0.90,1.02652,1.05,1.25382; size=3; a.setData(data, size); System.out.
14、println(测试f(0.955)=+a.function(0.955); 运行结果:/* *author 邓仕军 *version 0.1 *time 2012-05-03 * Hermite插值 */classHermite Derivative der;/ 导数类 privatedouble data;/ 传进来的数据 privateintsize;/ data值的对数 privatedouble a_x;/ (x) privatedouble b_x;/ (x) privateintcount; publicHermite() init(); publicHermite(double
15、 data, int size) init(data, size); voidinit() this.data = newdouble ; this.size = 0; this.count = 0; this.a_x = newdoublesize; this.b_x = newdoublesize; try der = new Derivative(this, this.getClass().getDeclaredMethod(fX, double.class); catch (NoSuchMethodException | SecurityException e) e.printStac
16、kTrace(); voidinit(double data, int size) this.data = data; this.count = 0; this.size = size; this.a_x = newdoublesize; this.b_x = newdoublesize; try der = new Derivative(this, this.getClass().getDeclaredMethod(fX, double.class); catch (NoSuchMethodException | SecurityException e) e.printStackTrace(
17、); / init(.); voidsetData(double data, int size) init(data, size); publicintgetSize() returnthis.size; publicdouble getData() returnthis.data; double function(double x) double sum = 0d; / 求参数 for (inti = 0; ithis.getSize(); i+) count = i;/ L(x)确定下标i a_xi = (1 - 2 * (x - this.getData()i0) * der.getDe
18、rivative(this.getData()i0) * lX(i, x) * lX(i, x); b_xi = (x - this.getData()i0) * lX(i, x) * lX(i, x); / 求值 for (inti = 0; ithis.getSize(); i+) sum += this.a_xi * this.getData()i1; for (inti = 0; ithis.getSize(); i+) sum += this.b_xi * this.getData()i2; return sum; /* * 被求导的函数 */ doublefX(double x)
19、returnlX(count, x); /* * L(X),k为下标 */ doublelX(int k, double x) double sum = 1d; for (inti = 0; ithis.size; i+) if (i != k) sum *= (x - datai0) / (datak0 - datai0); return sum; publicvoid print() System.out.printf(%8s, i:); for (inti = 0; ithis.size; i+) System.out.printf(%12s, i); System.out .print
20、ln(n -); System.out.printf(%8s, X); for (inti = 0; ithis.size; i+) System.out.printf(%12.5f, datai0); System.out.println(); System.out.printf(%8s, y=f(x); for (inti = 0; ithis.size; i+) System.out.printf(%12.5f, datai1); System.out.println(); System.out.printf(%8s, y=f(x); for (inti = 0; ithis.size;
21、 i+) System.out.printf(%12.5f, datai2); System.out.println(); System.out.printf(%8s, (x); for (inti = 0; ithis.size; i+) System.out.printf(%12.5f, a_xi); System.out.println(); System.out.printf(%8s, (x); for (inti = 0; ithis.size; i+) System.out.printf(%12.5f, b_xi); System.out.println(); importjava
22、.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;/* *author 邓仕军 *version 0.1 *time 2012-05-03 * Derivative:求一个函数的导数,运用反射机制 */class Derivative Method method; Object obj; public Derivative(Object obj, Method f) this.method = f; this.obj = obj; strictfpdoublegetDerivative(double x) double deriva1 = 0d, deriva2 = 0d; boolean flag = true; doubleDx = 0.0001;/ 增量X finaldouble precision =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1