簡體   English   中英

Matlab解決功能有問題嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM