public class calService { public static void calculate() throws Exception { System.out.println("f(x)=e^x的三次最佳平方逼近多项式为:"); getResult(calService.class.getMethod("f",double.class)); System.out.println("--------------------------"); System.out.println("f(x)=sin(x*π/2)的三次最佳平方逼近多项式为:"); getResult(calService.class.getMethod("sin",double.class)); public static double getResult(Method f) throws Exception { Method p0 = calService.class.getMethod("p0", double.class); Method p1 = calService.class.getMethod("p1", double.class); Method p2 = calService.class.getMethod("p2", double.class); Method p3 = calService.class.getMethod("p3", double.class); double fp0 = GetJiFen.getJiFen(f,p0,-1, 1); double fp1 = GetJiFen.getJiFen(f,p1,-1, 1); double fp2 = GetJiFen.getJiFen(f,p2,-1, 1); double fp3 = GetJiFen.getJiFen(f,p3,-1, 1); double p0p0 = GetJiFen.getJiFen(p0,p0,-1, 1); double p1p1 = GetJiFen.getJiFen(p1,p1,-1, 1); double p2p2 = GetJiFen.getJiFen(p2,p2,-1, 1); double p3p3 = GetJiFen.getJiFen(p3,p3,-1, 1); double a0 = fp0 / p0p0; double a1 = fp1 / p1p1; double a2 = fp2 / p2p2; double a3 = fp3 / p3p3; double px0 = a0 * 1 - a2 * 0.5; double px1 = a1 - 1.5 * a3; double px2 = a2 * 1.5; double px3 = a3 * 2.5; System.out.println("S*(x) = " + px0 + " + " + px1 + "x +" + px2 + "x^2 +" + px3 + "x^3"); return 0; public static double f(double x) { return Math.pow(Math.E, x); public static double sin(double x) { return Math.sin(Math.PI / 2 * x); public static double p0(double x){ return 1; public static double p1(double x){ return x; public static double p2(double x){ return (3 * x * x - 1) / 2; public static double p3(double x){ return (5 * x * x * x- 3 * x) / 2;

这里求定积分是使用了梯形求积分法。

package dao;
import java.lang.reflect.Method;
public class GetJiFen {
//    public static double getJiFen(Method f,double a, double b) throws Exception {
//        double sum = 0;
//        // 求出区间差,分成10000个区间,区间越小,误差越小
//        double e = cha(a, b, 10000.0);
//        // 求和,循环从第一个区间叠加到第10000个
//        for (int j = 1; j <= 10000; j++) {
//            double x = zhongjian(a, b, 10000.0, j);
//            sum = sum + (double)f.invoke(null, x);
//        }
//        return sum * e;
//    }
    public static double getJiFen(Method f,Method p, double a, double b) throws Exception {
        double sum = 0;
        double qujian = 1000000;
        // 求出区间差,分成10000个区间,区间越小,误差越小
        double e = cha(a, b, qujian);
        // 求和,循环从第一个区间叠加到第10000个
        for (int j = 1; j <= (int)qujian; j++) {
            double x = zhongjian(a, b, qujian, j);
            sum = sum + (double)f.invoke(null, x) * (double)p.invoke(null, x);
        return sum * e;
        // 定义被积函数,可以修改
        // 定义第i个区间的中点值,即定义积分变量
     public static double zhongjian(double a, double b, double n, int i) {
         return a + i * (b - a) / n;
        // 定义每个小区间的间隔差,即将范围分成n个等区间
     public static double cha(double a, double b, double n) {
         return (b - a) / n;

本代码实现了这两个实验 :

乡村振兴战略下传统村落文化旅游设计Cultural tourism design of traditional villages under strategy rural revitalization