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)

結果を返す

solve([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)

返す

ans =
-1.5056100417680902125994180096313

すべての解が返されていないので満足できません (WolframAlpha から取得した約 -1.5056、1.5056、-0.5663、および 0.5663 です)。

私は、vpasolve最初の推測でこれを処理できることを知っています。しかし、2 番目の質問である、すべての解を取得するための初期推定値を一般的に見つける方法がわかりません。

これらの問題を解決するための他の解決策または提案を歓迎します。

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

これ自体はバグではありませんが、sym/solveMuPADsymobj::solvefullsolve. 必要に応じてバグ レポートを提出してください。私の人生では、Matlab のこれらの部分をより適切に統合できない理由がわかりません。この分離は、ユーザーの観点からは意味がありません。

于 2014-05-24T16:05:09.440 に答える