07_作业

综合到目前为止的所有课程,实现这么一个并发算法:

计算给定函数 y=1/x 在定义域 [1,100]上围城与X轴围成的面积,计算步长0.01

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.function.Function;


/**
 * 计算给定函数 y=1/x 在定义域 [1,100]上围城与X轴围成的面积,计算步长0.01
 */
public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
        //函数 1/x
        Function<Double, Double> func = (x) -> 1.0 / x;

        double start = 1.0;
        double end = 100.0;
        double step = 1.0;
        double microStep = 0.01;
        List<Future<Double>> subAreas = new ArrayList<>();
        for(double x = start; x < end ; x++) {
            CalcArea calc = new CalcArea(func, x, Math.min(x+step, end), microStep);
            subAreas.add(executorService.submit(calc));
        }
        double area = 0;
        for(Future<Double> subArea : subAreas) {
            area += subArea.get();
        }
        System.out.println(area);


        executorService.shutdown();

    }

    static class CalcArea implements Callable<Double> {
        //要计算的函数
        Function<Double, Double> function;
        //区间起止点(左闭右开)
        double start;
        double end;
        //步长
        double step;


        public CalcArea(Function<Double, Double> func, double start, double end, double step) {
            this.function = func;
            this.start = start;
            this.end = end;
            this.step = step;
        }
        @Override
        public Double call() {
            double sum = 0;
            // function 在 [start,end)区间内的近似积分
            for(double x = start; x < end ; x += step) {
                if(x + step <= end) {
                    sum += function.apply(x) * step;
                } else {
                    sum += function.apply(x) * (end - x);
                }
            }
            return sum;
        }
    }
}

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注