関数があるとしますf = @(x) myfun(x)
。
を使用fzero
して特定の に最も近いソリューションを取得できますx0
が、特定の領域のすべてのソリューションを取得することはできます-5 < x < 5
か?
すなわち の結果に似た解を得ることができますroots
が、非多項式の場合ですか?
はい、できます。
まさにそれを可能にするファイル交換に関する素晴らしい提案があります。曲線をチェビシェフ多項式で近似し、その多項式の実根をすべて見つけることで機能します。
必要に応じて、根のこれらの推定値を の初期値として使用できますがfzero
、多くの場合 (少なくとも滑らかで動作が良好な曲線の場合)、高次のチェビシェフ近似を使用することで、精度の要求を既に満たすことができます。
あなたの例では、18個の関数評価のみを使用しています(ファイルのバージョンがわずかに変更されていますが、本質は同じです):
>> 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
たとえば、46 回以上の追加機能評価に対して、1 万分の 8 の改善しかありません。