【问题标题】:Evaluating logarithm of expression, given logarithms of variables计算表达式的对数,给定变量的对数
【发布时间】:2014-04-28 14:18:29
【问题描述】:

我必须以编程方式确定表达式的值:

 S = log(x1y1 + x2y2 + x3 y3 ...) 

仅使用以下值:

lxi = log(xi)
lyi = log(yi)

计算每个 lxilyi 的反对数可能是不切实际的,也不是想要的...

有没有什么方法可以把这个评估分解成一个简单的总结?

编辑

我在某处看到了一个 C 函数,它以简单的求和方式进行计算:

double log_add(double lx, double ly)
{
   double temp,diff,z;

   if (lx<ly) {
      temp = lx; lx = ly; ly = temp;
   }
   diff = ly-lx;
   z = exp(diff);
   return lx+log(1.0+z);
}

为每对值添加返回值,这似乎给出了正确的答案。但我无法弄清楚它是如何以及为什么起作用的!

【问题讨论】:

  • 不可能。你必须得到反日志。另外,反对数也不难得到,只要做 10^(log(xi))
  • @sshashank124 说的,但是如果日志是自然对数,用e代替10。
  • @sshashank124 请查看编辑。
  • @MikeDunlavey 请查看编辑。
  • log_add 是一个聪明的方法来做 一个 反日志而不是 两个。如果您愿意,我们可以引导您完成。

标签: math optimization logarithm expression-evaluation natural-logarithm


【解决方案1】:

直接的方法是执行两次求幂:

ln(x+y) = ln(eln(x) + eln(y))

log_add 函数使用稍微不同的方法来获得相同的结果,只需要 一个

ln(x+y) = ln((x+y)x/x)
= ln((x+y)/x) + ln(x)
= ln(1 + y/x) + ln(x)
= ln(1 + eln(y/x)) + ln(x)
= ln(1 + eln(y)-ln(x)) + ln(x)

【讨论】:

  • 巧妙的把戏。我想知道这是否会比原来的更快 - 我们仍然需要进行 log() 调用,并需要额外的条件来评估。你怎么看?
  • This 暗示 log() 可能更快
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多