[英]Issue with Matlab solve function?
以下命令
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
方案返回所有解決方案的集合?
(這與此問題有關 。)此外,當我嘗試求解方程式時
solve(fpp(x)==0,x,'Real',true)
哪個返回
回答=
-1.5056100417680902125994180096313
我不滿意,因為未返回所有解決方案(它們分別是從WolframAlpha獲得的-1.5056、1.5056,-0.5663和0.5663)。
我知道vpasolve
可以初步解決這個問題。 但是,我不知道如何通常可以找到初始猜測值來獲取所有解決方案 ,這是我的第二個問題。
歡迎解決這些問題的其他解決方案或建議。
正如我在上面的評論中所指出的那樣, sym/solve
主要用於求解方程的解析解。 如果失敗,它將嘗試查找數值解。 某些方程式可以具有無限數量的數值解(例如周期方程),因此,根據文檔 :“數值解算器不會嘗試查找該方程式的所有數值解。相反,它僅返回第一個找到的解決方案。”
但是,可以從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仍然可能會對這種行為差異以及相對於MuPAD的solve
而言, sym/solve
(以及底層symobj::solvefull
)性能差的問題感興趣。 如果願意,請提交錯誤報告 。 對於我的一生,我不明白為什么他們不能更好地統一Matlab的這些部分。 從用戶的角度來看,這種分離是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.