我试图制作一个简单的函数,在给定数据集的情况下进行指数曲线拟合。我写了以下内容:
private void runThread() {
new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText("#" + i);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
但是a和b似乎不正确。我使用Wolfram的基本公式。输入的数组的格式为 function expCurveFit(d){
var sum_x2 = 0, sum_lny = 0, sum_x = 0, sum_xlny = 0, n = d.length;
for(var i=0;i<d.length;i++){
var x = d[i][0];
var y = d[i][1];
sum_x2 += x^2, sum_lny += Math.log(y), sum_x += x, sum_xlny += x*Math.log(y);
}
var a = ((sum_lny*sum_x2)-(sum_x*sum_xlny))/((n*sum_x2)-sum_x^2);
var b = ((n*sum_xlny)-(sum_x*sum_lny))/((n*sum_x2)-sum_x^2);
return [a,b];
}
。任何人都有工作建议,插件,库或修订功能?
答案 0 :(得分:5)
^ is the XOR operator,而不是取幂。
将x^2
替换为Math.pow(x,2)
或x*x
,并对您拥有sum_x^2
的两个地方执行相同操作。
答案 1 :(得分:0)
除了XOR operator标记为此问题的答案之外, a 和 b 系数存在错误。
使用此方法拟合的曲线为Y = B * exp(A * x)
,如Wolfram中所述,但B = b
和A = exp(a)
!
因此您必须将返回[a,b]
更改为[ Math.exp(a), b]
(如果您想将此数组用作“等式”)