【问题标题】:Determine coefficients of exponential function using Apache Common Math使用 Apache Common Math 确定指数函数的系数
【发布时间】: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 中获得这些值时得到一些指导。谢谢。

【问题讨论】:

标签: java apache math wolfram-mathematica curve-fitting


【解决方案1】:

常数 A 无关紧要。

你可以重新排列你的函数:

y = A + Be(cx)

看起来像这样:

z = y-A = B*exp(c*x)

取两边的自然对数:

ln(z) = ln(B) + c*x

您将使用成对的(x, ln(z)) 进行最小二乘拟合来计算ln(B)c

您可以将A 任意设置为零以进行拟合。

当你有系数时,你可以重写函数来取回 y 的值。

您可以看到 A 所做的只是上下移动曲线。我的建议是向后推断以计算 x = 0 处的函数值,并从中设置 A 的值:

y(0) = A + B => A = B - y(0)

您的数据为您提供x = 10 的斜率:

y'(x = 10) ~ (43.9 - 86.5)/(20 - 10) = -4.26

使用它推断回x = 0

【讨论】:

  • 嗨,达菲,感谢您的回答。我不完全确定,所以我希望你能澄清我的任何错误。
  • 这就是你得到的一切,没有我为你做这件事。
  • 只是出于好奇,系数Bc 有特殊名称吗?像“指数前因数”之类的?
  • 特殊名称? A 是比例因子 - 只需垂直上下移动轴。 B 将是指数项的系数。 C*x 是指数。如果您正在处理瞬态问题,您可以将 1/C 视为时间常数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多