【发布时间】:2017-01-21 19:49:32
【问题描述】:
我有以下数据。
x = [10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
160]
和
y = [86.5
43.9
25.4
17.2
12
10.5
8
7.8
6.5
6.8
6.1
6.1
6
5.4
5.7
5.2]
指数形式:
y = A + Be(cx).
How to find coefficients for a possible exponential approximation
Least squares Levenburg Marquardt with Apache commons
我想找出这个函数的系数。上面提到的链接使我得出结论,我需要对函数进行线性化并使用 PolynomialCurveFitter 来确定系数。我使用下面的函数进行了测试并回溯,通过使用从 10 到 70 的 x 值并取其各自的 log(y-16) 来确定此过程是否适用于我的数据。
y = 16 + 200e-x/14
import java.util.Arrays;
import org.apache.commons.math3.fitting.PolynomialCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoints;
public class CurveFitting {
public static void main(String[] args) {
final WeightedObservedPoints obs = new WeightedObservedPoints();
obs.add(10, 4.58);
obs.add(20, 3.87);
obs.add(30, 3.16);
obs.add(40, 2.44);
obs.add(50, 1.73);
obs.add(60, 1.01);
obs.add(70, 0.29);
// Instantiate a first-degree polynomial fitter.
final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(1);
// Retrieve fitted parameters (coefficients of the polynomial function).
final double[] coeff = fitter.fit(obs.toList());
System.out.println(Arrays.toString(coeff));
}
}
产生以下值:[5.299999999999998,-0.07149999999999994]。即 B = exp5.3 = 200 和 C = -1/14。这只是可能的,因为我对 A 有先验知识,如果我对常数没有先验知识,我将如何计算这些系数?
使用 wolfram mathematica,A、B 和 C 的值分别为 6.381、161.144 和 -0.0706。我希望我能在 java 中获得这些值时得到一些指导。谢谢。
【问题讨论】:
-
更新我能够使用下面提到的 Jacquelin 方法计算 y = A + Becx 的系数:math.stackexchange.com/questions/1337601/… 该方法提供的系数与提供的系数接近来自 Mathematica。
标签: java apache math wolfram-mathematica curve-fitting