以下命令
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
有一些初步猜测可以解决这个问题。但是,我不知道我如何能够找到初始猜测的值以获得所有解决方案,这是我的第二个问题。
欢迎解决这些问题的其他解决方案或建议。
答案 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的这些部分。从用户的角度来看,分离是没有意义的。