首页 > 解决方案 > 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 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}]     ​

标签: tcl

解决方案


log()函数计算其参数的自然对数(正如该exp()函数是它的倒数,计算e x)。这意味着您的表达式变成(使用最简单的转换)只是:

set Y [expr {
    $Intercept + $Slope1*($X – $X0) + ($Slope2 – $Slope1)*$Delta*log(1+exp(($X-$X0)/$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
}

推荐阅读