3

在 Matlab 中求解方程最耗时的方法是什么:

exp(ax)-ax+c=0 

哪里ac是常量,x是我想要找到的值?目前我正在使用内置的求解器功能,并且我知道该解决方案是单值的,但它花费的时间比我想要的要长。

4

2 回答 2

3

仅仅想让某些东西运行得更快是不够的。

而且,对不起,但如果 fzero 不够快,那么对于一般的根查找工具,您将不会做得更好。

如果您不使用 fzero,那为什么不呢?毕竟,那是您没有命名的内置求解器。(要明确!否则我们必须猜测。)也许您正在使用符号工具箱中的求解。它会更慢,因为它是一个象征性的工具。

如上所述,我可能会指出,您可以通过认识到这确实是单个参数 c 的问题来改进。也就是将问题转化为解决

exp(y) - y + c = 0 

在哪里

y = ax

知道 y 的值后,除以 a 即可得到 x。

当然,这种看待问题的方式很明显表明您做了错误的陈述,即解决方案是单值的。对于小于 -1 的 c 的任何负值,有两种解决方案。当 c = -1 时,解是唯一的,当 c 大于 -1 时,实数中不存在解。(如果你允许复杂的结果,那么那里也会有解决方案。)

因此,如果您必须经常解决上述问题并且 fzero 不够,那么我会考虑一个样条模型,在该模型中,我已经为足够数量的不同 c 值预先计算了该问题的解决方案。插值该样条模型以获得任何 c 的预测值 y。

如果我需要更高的准确性,我可能会从那时起迈出牛顿一步。

如果您可以使用 Lambert W 函数,那么 solve 实际上确实为我们提供了一般问题的解决方案。(如您所见,我只是在猜测您要尝试解决什么问题,以及您的目标是什么。明确的问题可以帮助试图帮助您的人。)

solve('exp(y) - y + c')
ans =
c - lambertw(0, -exp(c))

Lambertw 的第一个参数为零产生负解。事实上,对于任何不大于 -1 的 c,我们可以使用 lambertw 来给出正解和负实解。

X = @(c) c - lambertw([0 -1],-exp(c));
X(-1.1)
ans =
     -0.48318      0.41622

X(-2)
ans =
      -1.8414       1.1462
于 2013-08-16T03:37:32.190 回答
1

象征性地解决你的系统

syms a c x;
fx0 = solve(exp(a*x)-a*x+c==0,x)

这导致

fx0 =

   (c - lambertw(0, -exp(c)))/a

正如@woodchips 所指出的,Lambert W函数有两个主要分支,W 0W -1。给出的解是关于上(或主)分支的,表示为W 0 ,您的方程实际上有W k的无限复数解(如果在 [−∞ 中,W 0W -1解是实数, c0])。在 Matlab 中,lambertw仅针对符号输入实现,因此如果您对数值(双精度)解决方案感兴趣,那么求解方程的方法非常缓慢。

如果您希望以有效的方式对此类方程进行数值求解,您可以查看Corless 等人。1996 年。但是,只要你的参数c在 [−∞, 0],即-exp(c)在 [−1/e, 0] 并且你对W 0分支感兴趣,你就可以使用我写的 Matlab 代码来回答一个Math.StackExchange 上的类似问题。与使用fzero.

如果您的值c不在 [−∞, 0] 中,或者您想要对应于不同分支的解决方案,那么您的解决方案可能是复值,您将无法使用我上面链接到的简单代码。在这种情况下,您可以通过阅读Corless 等人更充分地实现该功能。1996 年的论文,或者您可以尝试将 Lambert W转换为Wright ω 函数W 0 ( z ) = ω(log( z )), W −1 ( z ) = ω(log( z )−2π i )。在您的情况下,使用 Matlab 的wrightOmegaW 0分支对应于:

fx0 =

   (c - wrightOmega(log(-exp(c))))/a

W -1分支到:

fxm1 =

   (c - wrightOmega(log(-exp(c))-2*sym(pi)*1i))/a

如果c是真实的,那么上面的简化为

fx0 =

   (c - wrightOmega(c+sym(pi)*1i))/a

fxm1 =

   (c - wrightOmega(c-sym(pi)*1i))/a

Matlab 的wrightOmega函数也只是象征性的,但我编写了一个双精度实现(基于Lawrence, et al. 2012),您可以在我的 GitHub 上找到它,这比象征性地评估函数快 3 个数量级以上。由于您的问题在技术上是 Lambert W,因此为感兴趣的区域实现更复杂的函数可能更有效,并且可能在数值上更准确(这是由于对数转换和复杂的额外评估log)。但请随意测试。

于 2013-08-16T14:40:52.597 回答