2013-05-29 6 views

Antwort

6

Ja, Sie können.

Es gibt eine nette submission on the file exchange, die Sie genau das tun können. Es funktioniert, indem Sie Ihre Kurve durch ein Chebychev-Polynom approximieren und dann alle echten Wurzeln dieses Polynoms finden. Wenn Sie möchten, können Sie diese Abschätzungen für die Wurzeln als Anfangswerte für fzero verwenden, aber oft (zumindest für glatte und ansonsten gut verarbeitete Kurven) können die Genauigkeitsanforderungen bereits durch Verwendung einer Chebychev-Approximation höherer Ordnung erfüllt werden .

Für Ihr Beispiel nur 18 Funktionsauswertungen mit (ich habe eine leicht modifizierte Version der Datei, aber das Wesentliche ist das gleiche):

>> 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 

zB dort pro zehntausend Verbesserung nur 8 Teile für nicht weniger als 46 zusätzliche Funktionsauswertungen.

+0

@RobertP .: Nicht, daß ich ... wissen, was etwas seltsam ist, da [Tschebyscheff Polynome] (http://en.wikipedia.org/wiki/Chebyshev_polynomials) sind die beste Wahl für polynome Approximationen. In der Tat, zumindest für die Art der Funktion, mit der Sie es zu tun haben (glatt, kontinuierlich, etc.), kann erwartet werden, dass die Genauigkeit ziemlich hoch ist. Der einzige Nachteil dabei ist, dass es schwierig sein kann, "gute" Werte von "n" zu wählen (hier kommt die integrierte Grafikfunktion zum Einsatz). –

+1

+1 für Tschebytschew-Polynome, fand ich sie sehr nützlich in vielen Aspekten der Berechnung. – bla

2

Zuerst gibt es Matlab in Option eingebaut, der die symbolische Mathematik-Toolbox verwendet: mathworks.com/help/symbolic/mupad_ref/numeric-realroots.html

Eine weitere Option, wenn Ihre Funktion gut erzogen ist, wird nur fsolve mit den richtigen Vermutungen zu füttern, so dass, obwohl es sich um eine unter Verwendung von Schleife, es ist eine effiziente Berechnung. Zum Beispiel:

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

Danke @natan! Ich wusste nicht über numerische Realoots. Die zweite Lösung war auch nett! =) –

Verwandte Themen