2

以下命令

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 ])

这不是我所期望的。

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

(这与这个问题有关。)此外,当我尝试求解方程时

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

返回

答案=
-1.5056100417680902125994180096313

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

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

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

4

1 回答 1

1

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

但是,可以从 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]

以及警告信息。

对这个问题的回答提供了可以使用各种 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.

虽然这本身不是一个错误,但 MathWorks 仍然可能对这种行为差异以及sym/solvesymobj::solvefull对于 MuPAD 的solve. 如果您愿意,请提交错误报告。对于我的生活,我不明白为什么他们不能更好地统一 Matlab 的这些部分。从用户的角度来看,这种分离是没有意义的。

于 2014-05-24T16:05:09.440 回答