java中 通过多组数据拟合n次多项式

2021-05-18 00:00:00 拟合 多项式 多组

工作中可能会遇到这种计算情况,给出很多组数据,将数据放在表格中(散点图),然后让这些点分布在曲线附近,怎么得到这个n次多项式呢

《java中 通过多组数据拟合n次多项式》
java中有现成的jar包可以使用: commons-math3-3.6.1.jar (自行下载一下)
https://commons.apache.org/proper/commons-math/download_math.cgi

java接口代码:

@Controller
@RequestMapping("publicController")
public class PublicController
{ 
   
    @RequestMapping(value = "calculatePolynomial.do", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> calculatePolynomial(@RequestBody List<Map<String, Object>> list)
    { 
        Map<String, Object> map = new HashMap<>();
        try
        { 
            // 新增了一个jar包 注意添加
            WeightedObservedPoints points = new WeightedObservedPoints();

            for(int i = 0; i < list.size(); i++)
            { 
                //把数据点加入观察的序列 参数的格式注意一下***
                points.add(Double.valueOf(list.get(i).get("x").toString()), Double.valueOf(list.get(i).get("y").toString()));
            }

            PolynomialCurveFitter fitter = PolynomialCurveFitter.create(2);  //指定多项式阶数 可以放到参数里****
            double[] result = fitter.fit(points.toList());  // 曲线拟合完成后,结果保存于数组

            // double类型 保留四位小数 ****
            DecimalFormat df = new DecimalFormat("0.0000");

            List resultlist = new ArrayList();
            // 拟合出来的三个参数根据阶数由低到高***
            for(int i = 0; i < result.length; i++)
            { 
                resultlist.add(df.format(result[i]));
            }

            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("z", resultlist.get(0));
            resultMap.put("y", resultlist.get(1));
            resultMap.put("x", resultlist.get(2));

            map.put("result", resultMap);
            map.put("code", 200);
        }
        catch (Exception e)
        { 
            map.put("message", "计算过程出现异常");
            map.put("code", 0);
        }
        return map;
    }
}

postman测试一下:

《java中 通过多组数据拟合n次多项式》

需要注意的地方:

  1. 多项式的 阶数 可以自定义,我代码中写死了是 2 , 表示多项式中的 项次数 最高为2
  2. 曲线拟合完成后得到的数组 result 为 系数 数组, 系数对应的是阶数由低到高的单项式的系数,看不懂这句话的话,看下面:
{ 
    "result": { 
        "x": "-0.0771",
        "y": "-0.5178",
        "z": "35.2388"
    },
    "code": 200
}

最终的到的多项式为 y = -0.0071x² – 0.5178x + 35.2388

  1. 参数的格式要注意一下 我是用了一个ArrayList 里面若干个Map , Map里面有一个 “x” 一个“y”
    原文作者:司司司-
    原文地址: https://blog.csdn.net/siguangsong/article/details/122045036
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章