Java通过坐标点进行拟合函数
生活随笔
收集整理的這篇文章主要介紹了
Java通过坐标点进行拟合函数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
今天來記錄一下通過數(shù)據(jù)擬合函數(shù)的代碼,這里用到了commons-math3工具包進行擬合。
參考內(nèi)容:https://blog.csdn.net/wufeiwua/article/details/109004452
首先導入依賴
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version></dependency>?因為博主大學數(shù)據(jù)全都還給了老師,在同事的幫助下才實現(xiàn)如下代碼:
import com.adc.devp.function.bean.Point; import org.apache.commons.math3.analysis.ParametricUnivariateFunction; import org.apache.commons.math3.fitting.SimpleCurveFitter; import org.apache.commons.math3.fitting.WeightedObservedPoints;import java.util.Arrays; import java.util.List; import java.util.Objects;/*** 極化曲線擬合函數(shù)** @author: 劉朋* <br/>date:*/ class PolarizationFunction implements ParametricUnivariateFunction {private double[] parameters;/*** 定義公式* V = v0 - b * Math.log10(i) - r * i** @param i* @param parameters* @return*/@Overridepublic double value(double i, double... parameters) {double v0 = parameters[0];double b = parameters[1];double r = parameters[2];// 自定義函數(shù)return v0 - b * Math.log10(i) - r * i;}@Overridepublic double[] gradient(double i, double... parameters) {double[] gradients = new double[3];// 對 v0 求導gradients[0] = 1;// 對 b 求導gradients[1] = -Math.log10(i);// 對 r 求導gradients[2] = -i;return gradients;}/*** 擬合代碼邏輯** @param points 待擬合的數(shù)據(jù)* @return*/public PolarizationFunction fitting(List<Point> points) {ParametricUnivariateFunction function = new PolarizationFunction();/*多項式函數(shù)*//*猜測值 依次為 v0 b r 。必須和 gradient 方法返回數(shù)組對應(yīng)*/double[] guess = {250, 0.1, 0.1};// 初始化擬合SimpleCurveFitter curveFitter = SimpleCurveFitter.create(function, guess);// 添加數(shù)據(jù)點。帶權(quán)重的點,我的理解這個點權(quán)重越大,擬合出來的曲線會更靠近這個點WeightedObservedPoints observedPoints = new WeightedObservedPoints();for (Point point : points) {observedPoints.add(point.getX(), point.getY());}/** best 為擬合結(jié)果 對應(yīng) v0 b r* 可能會出現(xiàn)無法擬合的情況* 需要合理設(shè)置初始值* */double[] best = curveFitter.fit(observedPoints.toList());System.out.println(Arrays.toString(best));parameters = best;return this;}/*** @param x* @return*/public double caleY(double x) {if (Objects.isNull(parameters)) {throw new RuntimeException("參數(shù)為空,請先進行擬合操作");}return this.value(x, parameters);}} import lombok.Data; import lombok.EqualsAndHashCode;import java.io.Serializable;@Data @EqualsAndHashCode public class Point implements Serializable {private static final long serialVersionUID = 3256087124347421878L;private double x;private double y;public Point() {}public Point(double x, double y) {this.x = x;this.y = y;}}在此感謝我的同事晉津?qū)ξ业膸椭?#xff01;
總結(jié)
以上是生活随笔為你收集整理的Java通过坐标点进行拟合函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 拟合保存函数,matlab
- 下一篇: Inter core i7处理器中(x8