问题与Matlab解决功能?

时间:2014-05-24 15:01:06

标签: matlab solver symbolic-math symbolic-computation

以下命令

syms x real;
f = @(x) log(x^2)*exp(-1/(x^2));
fp(x) = diff(f(x),x);
fpp(x) = diff(fp(x),x);

solve(fpp(x)>0,x,'Real',true)

返回结果

  

求解([0.0 <(8.0 * exp(-1.0 / x ^ 2))/ x ^ 4 - (2.0 * exp(-1.0 / x ^ 2))/ x ^ 2 -   (6.0 * log(x ^ 2)* exp(-1.0 / x ^ 2))/ x ^ 4 +(4.0 * log(x ^ 2)* exp(-1.0 / x ^ 2))/ x ^ 6] ,   [x == RD_NINF..RD_INF])

这不是我所期望的。

第一个问题:是否有可能强制Matlab的solve返回所有解决方案的集合?

(这与this question有关。)此外,当我试图解决方程时

solve(fpp(x)==0,x,'Real',true)

返回

  

ans =
  -1.5056100417680902125994180096313

我不满意,因为没有返回所有解决方案(它们大约是-1.5056,1.5056,-0.5663和0.5663从WolframAlpha获得)。

我知道vpasolve有一些初步猜测可以解决这个问题。但是,我不知道我如何能够找到初始猜测的值以获得所有解决方案,这是我的第二个问题。

欢迎解决这些问题的其他解决方案或建议。

1 个答案:

答案 0 :(得分:1)

正如我在上面的评论中指出的那样,sym/solve主要用于求解方程的解析解。如果失败,它会尝试查找数字解决方案。一些方程可以有无数个数值解(例如,周期方程),因此,根据the documentation:“数值求解器不会尝试找到[方程]的所有数值解。相反,它返回只找到它找到的第一个解决方案。“

但是,可以从Matlab中访问MuPAD的功能。 MuPAD的numeric::solve函数有几个额外的功能。特别是'AllRealRoots'选项。在你的情况下:

syms x real;
f = @(x)log(x^2)*exp(-1/(x^2));
fp(x) = diff(f(x),x);
fpp(x) = diff(fp(x),x);
s = feval(symengine,'numeric::solve',fpp(x)==0,x,'AllRealRoots')

返回

s =

[ -1.5056102995536617698689500437312, -0.56633904710786569620564475006904, 0.56633904710786569620564475006904, 1.5056102995536617698689500437312]

以及警告信息。

我的answer to this question提供了可以使用各种MuPAD解算器的其他方式,特别是如果你可以隔离并包围你的根。

除了告诉你函数改变符号的位置之外,上述内容不会直接帮助你的不等式。对于那些你可以尝试:

s = feval(symengine,'solve',fpp(x)>0,x,'Real')

返回

s =

(Dom::Interval(0, Inf) union Dom::Interval(-Inf, 0)) intersect solve(0 < 2*log(x^2) - 3*x^2*log(x^2) + 4*x^2 - x^4, x, Real)

尝试将此功能与fpp一起绘制。

虽然这本身并不是一个错误,但是相对于MuPAD的sym/solve,MathWorks仍然可能对symobj::solvefull(以及基础solve)的行为差异和表现不佳感兴趣。 File a bug report如果你愿意的话。对于我的生活,我不明白为什么他们不能更好地统一Matlab的这些部分。从用户的角度来看,分离是没有意义的。