tcl中的一个自然对数公式

tcl中的一个自然对数公式,tcl,Tcl,此公式将在tcl中编码 Y= Intercept + Slope1*(X – X0) + (Slope2 – Slope1)*Delta*ln(1+exp((X-X0)/Delta)) 我搜索到这个公式中的ln()可以使用tcl中的log()进行编码 但是,我无法在tcl中获得正确的输出 这是我的密码,你能看一下吗?有什么评论吗?多谢各位 set Intercept 0.7416 set Slope1 52.42 set x0 0.01491 set Slope2 0.2533 set De

此公式将在tcl中编码

 Y= Intercept + Slope1*(X – X0) + (Slope2 – Slope1)*Delta*ln(1+exp((X-X0)/Delta))
我搜索到这个公式中的ln()可以使用tcl中的log()进行编码

但是,我无法在tcl中获得正确的输出

这是我的密码,你能看一下吗?有什么评论吗?多谢各位

set Intercept 0.7416
set Slope1 52.42
set x0 0.01491
set Slope2 0.2533
set Delta 0.002275
set y_frac [expr {
    $Intercept + $Slope1*($x/$tend - $x0/$tend)
    + ($Slope2-$Slope1) * $Delta * log10(1.0 + exp(($x/$tend - $x0/$tend)/$Delta))
}]
set y [expr {$y_frac *100.0}]     ​
log()
函数计算其参数的自然对数(正如
exp()
函数是其逆函数,计算ex)。这意味着您的表达式(通过最简单的转换)变成:

我会稍微重构表达式,因为delta是提取的自然对象:

set dX     [expr { $X - $X0 }]
set dSlope [expr { $Slope2 - $Slope1 }]
set Y      [expr { $Intercept + $Slope1*$dX + $dSlope*$Delta*log(1+exp($dX/$Delta)) }]
在这一点上,可能更容易定义一个过程来封装它

proc computeY {y} {
    global Intercept Slope1 Slope2 Delta x0
    set dX     [expr { $x - $x0 }]
    set dSlope [expr { $Slope2 - $Slope1 }]
    set Y      [expr { $Intercept + $Slope1*$dX + $dSlope*$Delta*log(1+exp($dX/$Delta)) }]
    return [expr { $Y * 100.0 }]; # Your final rescaling
}

自然对数在expr中使用log()函数计算。为什么在代码中写“log10”?这是以10为底的对数,而不是“自然”对数。
Intercept
etc的值构成合理的全局值…
proc computeY {y} {
    global Intercept Slope1 Slope2 Delta x0
    set dX     [expr { $x - $x0 }]
    set dSlope [expr { $Slope2 - $Slope1 }]
    set Y      [expr { $Intercept + $Slope1*$dX + $dSlope*$Delta*log(1+exp($dX/$Delta)) }]
    return [expr { $Y * 100.0 }]; # Your final rescaling
}