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.
@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 für Tschebytschew-Polynome, fand ich sie sehr nützlich in vielen Aspekten der Berechnung. – bla