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