私は関数があるとしますf = @(x) myfun(x)
;Matlabの任意の方程式にいくつかの解を得ることは可能ですか?
x0
に最も近い解を得るにはfzero
を使用できますが、特定の領域ですべての解を得ることができます。たとえば、-5 < x < 5
?
I.e. roots
の結果と同様の解を得ることは可能ですか?非多項式の場合は可能ですか?
私は関数があるとしますf = @(x) myfun(x)
;Matlabの任意の方程式にいくつかの解を得ることは可能ですか?
x0
に最も近い解を得るにはfzero
を使用できますが、特定の領域ですべての解を得ることができます。たとえば、-5 < x < 5
?
I.e. roots
の結果と同様の解を得ることは可能ですか?非多項式の場合は可能ですか?
はい、できます。
あなたはそれを正確に行うことができる素晴らしいsubmission on the file exchangeがあります。 Chebychev多項式で曲線を近似し、その多項式のすべての実根を見つけることによって動作します。
これらの推定値をfzero
の初期値として使用することができますが、多くの場合、(少なくとも滑らかな曲線や適切な曲線の場合は)より高次のChebychev近似。
>> f = @(A) 17.7*sin(A).*cos(A)+87*sin(A).^2-9.65*cos(A)-47*sin(A);
>> R = FindRealRoots(f, -5,5, 17)
R =
-3.709993256346244
-3.345207732130925
-0.201929737187637
0.572382702285053
2.573423209113534
2.937157987217741
>> R2 = R;
>> funcCount = 0;
>> for ii = 1:numel(R)
[R2(ii), ~,~, output] = fzero(f,R2(ii));
funcCount = funcCount + output.funcCount;
end
>> max(abs(R2(:)-R(:)))
ans =
8.564253235401331e-004
>> funcCount
ans =
46
例えば、1万改善あたりわずか8点の部品があります:(私は、ファイルを少し変更したバージョンを持っていますが、本質は同じである)のみ18関数評価を使用して、例えば
、 46以上の機能評価が必要です。まずそこにシンボリック数学ツールボックス使用するオプションに建てられたMATLABのさ:あなたの関数は行儀の場合mathworks.com/help/symbolic/mupad_ref/numeric-realroots.html
別のオプションは、ちょうど右の推測でfsolve
を供給することであるので、それが使用しているにもかかわらず、ループでは、効率的な計算です。たとえば、次のように
A=linspace(-5,5,1000);
[email protected](A) 17.7.*sin(A).*cos(A)+87.*sin(A).^2-9.65*cos(A)-47*sin(A)
idx = find(diff(sign(f(A))));
for n=1:numel(idx)
r(n)=fzero(f,A(idx(n)))
end
r=
-3.709541990613713
-3.345170894638306
-0.202018624930518
0.572128202319968
2.573643316565874
2.938014412541281
ありがとう@natan!私は 'numeric :: realroots'について知らなかった。 2番目の解決策も素晴らしかったです! =) –
@RobertP:私の知っている...やや奇妙である、[チェビシェフ多項式](http://en.wikipedia.org/wiki/Chebyshev_polynomials)が最良の選択であるため、該当なし多項式近似のために。確かに、少なくともあなたが扱っている機能のタイプ(滑らかで連続的なものなど)では、精度はかなり高くなると予想されます。唯一の欠点は、nの良い値を選択するのが難しいことです(これは組み込みプロット関数が便利なところです)。 –
+1チェビシェフ多項式を示唆するために、私は計算の多くの面で非常に有用であることが分かった。 – bla