【问题标题】:why does log and exp matlab functions produce the inverse result?为什么 log 和 exp matlab 函数会产生相反的结果?
【发布时间】:2014-02-18 11:31:33
【问题描述】:

为什么amatlab中的b不一样??

a = signal;
b = exp(log(signal));

如果我绘制a和b,信号不一样,有什么帮助吗?

【问题讨论】:

  • 什么是signal?它是否偶然有负面或虚构的成分? “不一样”是什么意思?在相等的意义上(我假设你是在浮点中接线)或完全不同的值?
  • @horchler 信号是信号的一个例子。是的,它有负值。
  • 在 matlab 中显示一个例子!

标签: matlab logarithm exponential


【解决方案1】:

负数的对数-xy = log(x)+pi*1i。因此,当您将指数函数应用于y 时,您将得到一个零虚部(或看起来像零的东西)。试试这个例子:

format long
x = -1;
y = exp(log(x))
abserr = abs(x-y)

阅读有关复数对数的更多信息here

当然,浮点数也可能导致不准确。如果您的signal 的值接近1/eps(或-1/eps),则绝对误差可能特别重要。试试

x = 1/eps;
y = exp(log(x));
abserr = abs(y-x)  
relerr = abs(y-x)/abs(x)

返回

abserr =

  11.500000000000000


relerr =

     2.553512956637860e-15

请注意,相对误差很小。在floating point calculations 中,相对误差通常是我们希望控制的。

【讨论】:

  • 我必须多次阅读“留下零虚部”才能理解您在这里要说的内容。基本上,exp(y) 将是复值,其中 x 是实数。由于舍入误差,exp(y) 的虚部可能不完全为零。
  • @sellibitze:感谢您的建议——我已尝试更新。这个想法是,即使虚部正好为零,输出现在也将是复数(即,当输入以前都是实数时,现在虚部为零:complex(-1,0))。因此,看起来结果可能有所不同。而且即使打印出来的虚部看起来为零,也可能只是很小而已。
  • 现在,我不确定你想用“留下零虚部”说什么。尽管我知道复指数背后的数学并且可以写出我自己的答案,但我还是觉得它相当混乱。
  • @sellibitze:取一个负数的对数,例如,log(-1),得到一个复数。从数学上讲,取log(-1) 的指数应该得到-1。但我们不是在做数学,而是在编程。因此,如果没有数字错误,Matlab 将返回complex(-1,0)(它实际上返回-1+1.224646799147353e-16*1i,打印时看起来相同)。因为log(-1) 的中间结果很复杂,所以后面的所有结果都会很复杂。将“复杂”视为数据类型而不是数学结构(输入 whos 以查看变量是否复杂)。
  • 您可以阅读complex 上的文档。顺便说一句,isreal(complex(-1,0)) 在 Matlab 中返回 false。
【解决方案2】:

如果您使用带有复数或负数的log,Matlab 会计算复数对数。这会产生意想不到的结果。

a = abs(signal);
b = exp(log(a));

将按照您的预期工作(尽管信号的复杂部分和符号会在此过程中丢失)。

b = log(exp(signal));

也可以使用,因为它不需要处理复杂的对数。

换句话说,您必须确保尊重您的职能领域。真实的(如非复数)log 的域都是正数(!)实数,而真实的exp 的域是所有数字。另一方面,log 的图像都是实数,而真实的exp 的图像都是正实数。这就是为什么它以一种方式工作,但不能以另一种方式工作。你正在尝试做一些真正的log 做不到的事情,所以Matlab 切换到复杂的log。虽然exp 仍然会反转它,但您会得到复杂的结果,这些结果的处理方式不同,并且看起来完全不同,具体取决于您之后对它们的处理方式。

【讨论】:

  • 此外,horchler 的回答很好地解释了为什么它不适用于复数对数。我只是奇怪地没有收到关于他回答的通知......
  • 但是 exp 确实 反转 log 几乎完全一样的正数和负数 - 只有一个很小的数字错误。
【解决方案3】:

horchler 的回答当然是正确的——但我认为它错过了导致 OP 混乱的 plotting 部分。由于 Matlab 在必要时使用复数,log 也定义为负数,exp 应该是 log 的精确倒数——除了舍入误差。 signalexp(log(signal)) 之间的数值差异几乎总是很小。一个例子:

>> signal = (-2:2)'

signal =

    -2
    -1
     0
     1
     2

>> exp(log(signal))

ans =

                         -2 +  2.44929359829471e-16i
                         -1 +  1.22464679914735e-16i
                          0 +                     0i
                          1 +                     0i
                          2 +                     0i

但是,plot 的行为会根据参数是实数还是复数而有所不同:

subplot(1, 2, 1)
plot(signal, '.-')
subplot(1, 2, 2)
plot(exp(log(signal)), '.-')

结果

虽然这两个向量的数值差异可以忽略不计,但 绘图 看起来完全不同。

这是因为如果使用单个实值向量作为参数调用,plot 使用给定的向量值作为垂直轴,使用向量索引 (1, 2, ...) 作为水平轴。但是,如果使用单个复值向量调用,plot 使用 实部 作为水平轴,使用 虚部 作为垂直轴。即上述代码中对plot的两次调用等价于

plot(1 : 5, signal, '.-')

plot(real(exp(log(signal))), imag(exp(log(signal))), '.-')

分别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2014-10-18
    • 2015-03-11
    • 2022-11-21
    相关资源
    最近更新 更多