2013-05-29 9 views

答えて

6

はい、できます。

あなたはそれを正確に行うことができる素晴らしい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以上の機能評価が必要です。

+0

@RobertP:私の知っている...やや奇妙である、[チェビシェフ多項式](http://en.wikipedia.org/wiki/Chebyshev_polynomials)が最良の選択であるため、該当なし多項式近似のために。確かに、少なくともあなたが扱っている機能のタイプ(滑らかで連続的なものなど)では、精度はかなり高くなると予想されます。唯一の欠点は、nの良い値を選択するのが難しいことです(これは組み込みプロット関数が便利なところです)。 –

+1

+1チェビシェフ多項式を示唆するために、私は計算の多くの面で非常に有用であることが分かった。 – bla

2

まずそこにシンボリック数学ツールボックス使用するオプションに建てられた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 
+0

ありがとう@natan!私は 'numeric :: realroots'について知らなかった。 2番目の解決策も素晴らしかったです! =) –

関連する問題