2014-05-24 57 views
2

以下命令用Matlab解决问题的功能?

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^(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

我我不满意,因为所有的解决方案都没有退回(他们是ap从WolframAlpha获得的近似-1.5056,1.5056,-0.5663和0.5663)。

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

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

+1

另一个有趣的问题是,为什么'solve(fpp(x)== 0,x,'Real',true)'返回一个不完整的结果,正如前面提到的那样有4个解。 – Daniel

+2

'solve'被设计来做符号数学。正如[文档状态](http://www.mathworks.com/help/symbolic/solve.html#btrxs35-1)所述,“由于公式不是多项式,因此尝试查找所有可能的解决方案可能需要很长时间数值求解器不会尝试为这个方程寻找所有的数值解,而是只返回找到的第一个解。然而,Matlab有其他选项可用。我将为这种情况解决方案... – horchler

回答

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一起密谋此功能。

虽然这不是本质上的错误左右,The MathWorks公司仍可能有兴趣在行为和sym/solve表现不佳相对于MuPAD的solve这种差异(底层symobj::solvefull和)。 File a bug report如果你喜欢。对于我的生活,我不明白他们为什么不能更好地将Matlab的这些部分统一起来。从用户的角度来看,分离是没有意义的。

+0

哇..非常感谢。 Mathworks可能会有许多符号计算问题需要改进。你帮助我做了很多。周末愉快! – epsilonxe