java中 通过多组数据拟合n次多项式
工作中可能会遇到这种计算情况,给出很多组数据,将数据放在表格中(散点图),然后让这些点分布在曲线附近,怎么得到这个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测试一下:
需要注意的地方:
- 多项式的 阶数 可以自定义,我代码中写死了是 2 , 表示多项式中的 项次数 最高为2
- 曲线拟合完成后得到的数组 result 为 系数 数组, 系数对应的是阶数由低到高的单项式的系数,看不懂这句话的话,看下面:
{
"result": {
"x": "-0.0771",
"y": "-0.5178",
"z": "35.2388"
},
"code": 200
}
最终的到的多项式为 y = -0.0071x² – 0.5178x + 35.2388
- 参数的格式要注意一下 我是用了一个ArrayList 里面若干个Map , Map里面有一个 “x” 一个“y”
原文作者:司司司-
原文地址: https://blog.csdn.net/siguangsong/article/details/122045036
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/siguangsong/article/details/122045036
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章