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测试一下:

接口测试

需要注意的地方:

  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”
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值