Differenzialrechnung, Beispiele. - Seite 4

 
Yousufkhodja Sultonov:

Erhöht man die Stichprobe auf N=100, so ergibt sich aus der Gleichung 4:



Mathematisch gesehen, sind die Grenzen Ihrer Suche sehr unscharf. Könnten Sie bitte näher erläutern, wie es aussieht?

 
Nikolai Semko:

Ja, ich habe mich geirrt. Ich dachte, Sie würden wirklich eine Annäherung verwenden. Ich habe mir Ihren Code genauer angesehen und festgestellt, dass es sich nicht um eine Annäherung, sondern nur um eine triviale, wenn auch sehr ungewöhnliche Mittelwertbildung handelt. Danach verschieben Sie die violette Linie und die rote Linie um 72 Balken nach links und beenden das Zeichnen des roten Schweifs von 92 Balken, der mit jedem neuen Balken neu gezeichnet wird. Die blaue Linie wird aus der verschobenen violetten Linie gebildet. Übrigens ist es korrekter, den Schlusskurs und nicht den Eröffnungskurs zu verwenden. Wenn Sie zu close wechseln, können Sie sofort sehen, dass bei jedem Tick der rote Schweif von 92 Balken springt.

Die Verschiebung der gleitenden Durchschnitte nach links hat keinen Nutzen und keine praktische Anwendung. Sie dient nur der Schönheit, der Passform und dem Charme.

Wir müssen den Unterschied zwischen Annäherung und Glättung (Mittelwertbildung) verstehen. Bei der Approximation werden die Koeffizienten einer Funktion (Polynom, Fourier, Bezier, Spline usw.) auf einem bestimmten Datenintervall berechnet, und diese Koeffizienten ändern sich in der Regel, wenn sich mindestens ein Datenwert ändert, so dass die Funktion über das beobachtete Datenintervall neu gezeichnet wird. Bei der Mittelwertbildung wird jedoch nur ein aktueller Punkt auf der Grundlage der vorherigen Daten berücksichtigt; daher wird die Mittelwertbildung (Glättung) nicht neu gezeichnet, sondern bleibt im Gegensatz zur Annäherung immer hinter den Daten zurück.
Und ich verstehe nicht, was ein Polynom irgendeines Grades und das Newtonsche Binom damit zu tun haben, wenn es in dem Code gar keine Grade gibt.

))

Aha, und jetzt auch eine Sinuskurve ohne explizite Sin-Funktion.

Die Differenzgleichung für Sinus:https://dxdy.ru/post1247421.html#p1247421

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a2_Buffer[i]=  2701*a1_Buffer[i]   -5328   *a1_Buffer[i+1 ]    +  2628 *a1_Buffer[i+2 ];

      a4_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}

      a3_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a3_Buffer[i+0+z]=  2.998096443*a3_Buffer[i+1+z]  -  2.998096443*a3_Buffer[i+2+z]   +   1*a3_Buffer[i+3+z]   ;  }}

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}

      a6_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a6_Buffer[i+0+z]=  3.998096443*a6_Buffer[i+1+z]  -  5.996192886*a6_Buffer[i+2+z]   +   3.998096443*a6_Buffer[i+3+z]  -  1*a6_Buffer[i+4+z] ;  }}

Die Berechnung von Sinuswellen mit der Periode 144 wird hervorgehoben. Die erste liegt in der Nähe der Konstante (grün in der Abbildung), die zweite in der Nähe der schrägen Linie (rot in der Abbildung).

Рекуррентная формула для синуса : Дискуссионные темы (М) - Страница 7
  • dxdy.ru
В принципе, используется и рекуррентное вычисление через возвратное уравнение второго порядка, и через комплексную экспоненту. Первое менее расходно по ресурсам (умножение и два сложения и две ячейки памяти) по сравнению со вторым (два умножения, четыре сложения, две ячейки памяти при постоянной частоте), но накапливается погрешность быстрее...
 

Wahrscheinlich hätte ich dem Zweig gleich eine "Leseliste" beifügen sollen. ))

Es gibt sehr viel Literatur zu diesem Thema, deshalb möchte ich Ihnen ein paar schlanke Bücher empfehlen, die meinem Geschmack entsprechen:

Berechnung endlicher Differenzen von Leonid Kuzmich Lakhtin.

Markushevich A.I. Rückkehr Sequenzen

 
Aleksey Panfilov:

))

Aha, und jetzt auch eine Sinuskurve ohne explizite Sin-Funktion.

Die Differenzgleichung für Sinus:https://dxdy.ru/post1247421.html#p1247421

Die Berechnung der Sinuskurven mit der Periode 144 wird hervorgehoben. Die erste liegt in der Nähe der Konstante (grün in der Abbildung), die zweite in der Nähe der schrägen Linie (rot in der Abbildung).


Danke, Alexey, für die Literatur. Ich gebe zu, dass die Rekursion durchaus ihre Berechtigung hat und erfolgreich eingesetzt werden kann, um einige Funktionen oder Algorithmen zu beschleunigen, aber um ehrlich zu sein, bin ich mir da nicht so sicher.
Ich plädiere lediglich dafür, die Dinge beim richtigen Namen zu nennen und die übliche Terminologie zu verwenden, damit es keine Verwechslungen gibt. Meiner Meinung nach wäre es logischer gewesen, die Rekursion am Anfang dieses Threads zu erwähnen und die Interpolation, die Approximation und die Polynome nicht zu erwähnen, da sie in Ihrem Beispiel nicht vorkommen. Und es wäre besser gewesen, sich auf die Verschiebung des Indikators nach links zu konzentrieren, um andere nicht durch übertriebene Korrektheit der Formen in die Irre zu führen, denn nicht jeder versteht gerne den Code anderer Leute, auch ich bin darauf hereingefallen.

Alexey, soweit ich weiß, sind Sie ein Profi auf dem Gebiet der Rekursion. Ich persönlich bin darin ahnungslos. Ich habe eine Frage, eine Bitte und eine Anregung. Können Sie Ihre Methoden verwenden, um die Annäherung durch die Fourier-Methode zu beschleunigen? Irgendetwas sagt mir, dass das möglich ist. Wenn Sie es schaffen, wird es ein WOW!!! und der praktische Nutzen wird enorm sein. Ich füge ein Beispiel für die Approximation mit Fourier-Extrapolation auf MT5 bei (es funktioniert einfach viel schneller und besser). Ich habe dieses Beispiel von hier übernommen und der Übersichtlichkeit halber ein wenig verbessert, indem ich die Maussteuerung mit der Strg-Taste (die die Startposition ändert) und der Umschalttaste (die den Beobachtungszeitraum bei gleichzeitiger Änderung der Anzahl der Harmonischen ändert) hinzugefügt habe. Können Sie es ausprobieren?

Dieser Indikator funktioniert folgendermaßen: Klicken Sie zunächst mit der Maus auf das Diagramm (um das Fenster zu aktivieren), drücken Sie die Strg-Taste (und lassen Sie sie wieder los) und bewegen Sie die Maus, um die Startposition zu ändern. Um den Vorgang abzuschließen, drücken Sie eine beliebige Taste (außer Strg und Shift). Das Gleiche gilt für die Umschalttaste, um die Periode (Bereich der Balken für die Näherungsfunktion) zu ändern.

Dateien:
Fourier.mq5  16 kb
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Differenzialrechnung, Beispiele.

Nikolai Semko, 2018.01.12 00:43


Ich plädiere lediglich dafür, die Dinge bei ihrem richtigen Namen zu nennen und eine allgemein anerkannte Terminologie zu verwenden, damit es keine Verwechslungen gibt. Meiner Meinung nach wäre es logischer gewesen, die Rekursion am Anfang dieses Threads zu erwähnen und die Interpolation, die Approximation und die Polynome nicht zu erwähnen, da sie in Ihrem Beispiel nicht vorkommen. Und es wäre richtiger gewesen, sich auf die Verschiebung des Indikators nach links zu konzentrieren, um andere nicht durch übertriebene Korrektheit der Formen in die Irre zu führen, denn nicht jeder schaut gerne in den Code anderer Leute, auch ich war darauf hereingefallen.


Nikolai, danke für den Beitrag und den beigefügten Indikator.

Und ich stimme voll und ganz zu, dass zunächst einmal ein eindeutiges Verständnis von Begriffen und Namen erforderlich ist.

Lassen Sie mich meinen Standpunkt erläutern.

Sie können eine Linie durch zwei Punkte ziehen, was bedeutet, dass Sie jeden Punkt dieser Linie entweder innerhalb des Intervalls zwischen den Punkten (Interpolation) oder außerhalb des Intervalls zwischen den Punkten (Extrapolation) finden können.

Sie können eine einwertige Kurve zeichnen, die z. B. einer quadratischen Parabel entspricht , die in einem kartesischen Koordinatensystem durch eine lineare quadratische Gleichung ausgedrückt wird. Das bedeutet, dass es auch möglich ist, jeden Punkt dieser Kurve entweder innerhalb des Intervalls zwischen den Extrempunkten (Interpolation) oder außerhalb dieses Intervalls (Extrapolation) zu finden. Das Gesetz, nach dem diese Punkte aufgetragen werden, bleibt polynomial. Ich sollte noch hinzufügen, dass es zumindest bei drei Punkten möglich ist, eine einwertige Sinuswelle zu zeichnen, wenn wir ein Sinuswellengesetz annehmen, oder einen Kreis, wenn wir sein Vorhandensein annehmen.

So erweist sich die Interpolation durch ein Polynom zweiten Grades über drei Punkte ( von denen in unserem Fall zwei die Vorgeschichte akkumulieren und der dritte neue Informationen enthält) des vierten Punktes als eine notwendige (es kann auch andere Gesetze geben) und hinreichende Definition der Handlung oder des Prozesses.

Es sei denn, Sie schlagen andere Begriffe dafür vor.

Abgesehen davon stimme ich voll und ganz zu, dass man, wenn man eine Kurve nach der Anzahl der Werte, die über die erforderliche Mindestanzahl hinausgehen, darstellen will, statistisch (oder anderweitig) solide Methoden zur Gewichtung der Werte, einschließlich Regression, anwenden sollte.
 
Aleksey Panfilov:


Nikolai, danke für den Beitrag und den beigefügten Indikator.

Und ich stimme voll und ganz zu, dass zuallererst ein klares Verständnis der Begriffe und Bezeichnungen erforderlich ist.

Lassen Sie mich meinen Standpunkt erläutern.

Man kann eine Linie durch zwei Punkte ziehen, d.h. man kann jeden beliebigen Punkt dieser Linie finden, entweder innerhalb des Intervalls zwischen den Punkten (Interpolation) oder außerhalb des Intervalls zwischen den Punkten (Extrapolation).

Sie können eine einwertige Kurve zeichnen, die z. B. einer quadratischen Parabel entspricht, die im kartesischen Koordinatensystem durch eine linear-quadratische Gleichung ausgedrückt wird. Das bedeutet, dass es auch möglich ist, jeden Punkt dieser Kurve entweder innerhalb des Intervalls zwischen den Extrempunkten (Interpolation) oder außerhalb dieses Intervalls (Extrapolation) zu finden. Das Gesetz, nach dem diese Punkte aufgetragen werden, bleibt polynomisch. Ich sollte noch hinzufügen, dass es zumindest bei drei Punkten möglich ist, eine eindeutige Sinuswelle zu zeichnen, wenn wir ein Sinuswellengesetz annehmen, oder einen Kreis, wenn wir sein Vorhandensein annehmen.

So erweist sich die Interpolation durch ein Polynom zweiten Grades über drei Punkte (von denen in unserem Fall zwei die Vorgeschichte akkumulieren und der dritte neue Informationen enthält) des vierten Punktes als eine notwendige (es kann auch andere Gesetze geben) und hinreichende Definition der Handlung oder des Prozesses.

Es sei denn, Sie schlagen andere Begriffe dafür vor.

Abgesehen davon stimme ich voll und ganz zu, dass Sie, wenn Sie eine Kurve für eine Anzahl von Werten zeichnen müssen, die über die erforderliche Mindestanzahl hinausgeht, statistisch (oder anderweitig) begründete Methoden der Wertgewichtung, einschließlich Regression, anwenden müssen.

Wie man eine Polynomkurve durch drei Punkte konstruiert, habe ich kürzlich in diesem Code implementiert . Ich empfehle Ihnen, einen Blick darauf zu werfen.

Aber Ihr Code berechnet das Polynom nicht nach drei Punkten:

Aleksey Panfilov:

In der Grafik sieht das so aus:

Die blau-rote Linie ist eine Interpolation (Finden eines Punktes innerhalb eines Intervalls) durch ein Polynom 4. Grades mit einer Schulter von 72.

a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

Die dünne blaue Linie ist die Extrapolation (Auffinden eines Punktes außerhalb des Intervalls) durch das Polynom vom Grad 2 mit Hebelwirkung 78.

a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

Die rote Linie ist die Konstruktionslinie für das Polynom der Potenz 4. Er wird neu gezeichnet und basiert auf dem letzten Takt-Eröffnungspunkt.

a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}


Was Sie als Polynom 2. Grades und als Polynom 4. Grades bezeichnen, sind keine Polynome.

Da die Formel für ein Polynom 2. Grades

Price = a+b*i+c*i²

sondern die Formel eines Polynoms 4. Grades:

Price = a+b*i+c*i²+d*i³+f*i⁴

wobei

a,b,c,d,f - zu berechnende Koeffizienten

i ist die Nummer des Balkens.

Und Sie haben eine kunstvolle Art der Mittelwertbildung, bei der (am Beispiel eines Polynoms vom Grad 2, wie Sie es nennen) der aktuelle Punkt einer Linie i aus den letzten drei Punkten (i, i+1 und i+2) einer anderen Linie mit unterschiedlichen Gewichtskoeffizienten berechnet wird. Dies wird als Mittelwertbildung (oder Glättung) bezeichnet. Deshalb haben Sie das Diagramm um 72 Balken nach links verschoben, um die Verzögerung zu verbergen, die durch die Mittelwertbildung entsteht.

In meinemBeispiel ist die Berechnung des Polynoms durch drei Punkte deutlich sichtbar.

 
Nikolai Semko:

In meinemBeispiel ist jedoch die Berechnung des Polynoms über die drei Punkte klar und deutlich sichtbar.

Ihr Indikator ist sehr gut.

Wenn Sie denselben für eine Vier haben, dann befestigen Sie ihn an drei beliebigen Punkten der grauen Indikatorlinie aus Beitrag 23 dieses Threads.

Diese Linie (grau) wird im Puffer berechnet:

 a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}
1*Y1-3*Y2+3*Y3-1*Y4=0 - Differenzgleichung einer Parabel zweiten Grades. Für äquidistante Punkte.
 
Aleksey Panfilov:

Ihr Indikator ist ein sehr guter Indikator.

Wenn Sie denselben für eine Vier haben, befestigen Sie ihn an drei beliebigen Punkten der grauen Indikatorlinie aus Beitrag 23 dieses Threads.

Diese Linie (grau) wird im Puffer berechnet:

1*Y1-3*Y2+3*Y3-1*Y4=0 ist die Differenzgleichung einer Parabel zweiten Grades. Für äquidistante Punkte.

Ich habe den Code für MT4 weiter unten in den Kommentaren dort

Ja, die graue Linie, die Sie sehen, ist ein Polynom. Und der rote Schwanz des 92er-Balkens von der 2er-Meldung, den Sie zum verschobenen Durchschnitt neu zeichnen, ist ebenfalls ein Polynom und wird einfach neu gezeichnet. Aber Sie nennen alles andere ein Polynom und behaupten gleichzeitig, dass Ihr Polynom nicht neu gezeichnet wird. Und das tut sie nicht. Deshalb bitte ich Sie, die Dinge bei ihrem richtigen Namen zu nennen.

Übrigens, in meinem Beispiel erfolgt die Bildung der nächsten Punkte im Polynom durch Berechnung der Koeffizienten, und dieser Algorithmus ist schneller als Ihre "Differenzrechnung", obwohl auch ich die Differenz zum vorherigen Wert verwende:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

Ihre Wahl:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }
 
Nikolai Semko:

Ich habe den Code für MT4 weiter unten in den Kommentaren

Ja, die graue Linie, die Sie sehen, ist ein Polynom. Und der rote Schweif von 92 Balken aus der 2. Nachricht, den Sie zum verschobenen Durchschnitt ziehen, ist ebenfalls ein Polynom und überzeichnet. Aber Sie nennen alles andere ein Polynom und behaupten gleichzeitig, dass Ihr Polynom nicht neu gezeichnet wird. Und das tut sie nicht. Deshalb bitte ich Sie, die Dinge bei ihrem richtigen Namen zu nennen.


Ja, ich stimme mit dem Polynom zweiten Grades überein, da nur 4 Punkte an der Konstruktion beteiligt sind, oder 6 Punkte für das Polynom vierten Grades. Die gesamte Linie, die sich ergibt und nicht neu gezeichnet wird, ist natürlich kein Polynom, sondern wird nur in den betrachteten Fällen mit einem Polynom eines bestimmten Grades konstruiert.

Die dünnen Linien stellen nur die Polynome dar, mit denen der nächste Punkt konstruiert wird.

Es sieht so aus, als wären wir uns über die Bedingungen einig. :)


Übrigens erfolgt in meinem Beispiel die Bildung der nächsten Punkte im Polynom durch Berechnung der Koeffizienten, und dieser Algorithmus ist schneller als Ihre "Differenzrechnung", obwohl auch ich die Differenz zum vorherigen Wert verwende:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

Ihre Wahl:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }

Was die Geschwindigkeit betrifft, haben Sie wahrscheinlich Recht.

Ich schlage vor, dass wir die Fragen der Geschwindigkeit und wahrscheinlich der Fahrlässigkeit (in erster Linie meine:)) nicht berühren. ) in der Kodierung, natürlich nur, wenn sie nicht kritisch sind.

 
Nikolai Semko:

Können Sie Ihre Methoden nutzen, um die Fourier-Näherung zu beschleunigen? Irgendetwas sagt mir, dass das möglich ist. Wenn Sie es schaffen, wird es ein Aha-Erlebnis sein, und der praktische Nutzen wird enorm sein. Ich füge ein Beispiel für die Approximation mit Fourier-Extrapolation auf MT5 bei (es funktioniert einfach viel schneller und besser). Ich habe dieses Beispiel von hier übernommen und der Übersichtlichkeit halber ein wenig verbessert, indem ich die Maussteuerung mit der Strg-Taste (die die Startposition ändert) und der Umschalttaste (die den Beobachtungszeitraum bei gleichzeitiger Änderung der Anzahl der Harmonischen ändert) hinzugefügt habe. Können Sie es ausprobieren?

Dieser Indikator funktioniert folgendermaßen: Klicken Sie zunächst mit der Maus auf das Diagramm (um das Fenster zu aktivieren), drücken Sie die Strg-Taste (und lassen Sie sie wieder los) und bewegen Sie die Maus, um die Startposition zu ändern. Um den Vorgang abzuschließen, drücken Sie eine beliebige Taste (außer Strg und Shift). Dasselbe gilt für die Umschalttaste, um die Periode (Bereich der Balken zur Berechnung der Näherungsfunktion) zu ändern.


Was Fourier betrifft, so ist das Thema sehr umfangreich. Wenn Interesse besteht, werden wir das Thema von Zeit zu Zeit aufgreifen.

Höchstwahrscheinlich werden sich die Hauptfragen aus der Problemstellung ergeben (aufgrund der anderen Methode). Soweit ich das verstanden habe, wählt der Indikator die Frequenzen mit der größten Amplitude aus dem Fourier-Spektrum aus.

Ich hatte die Idee, denFourier-Indikator an eine bereits gemittelte Polynomlinie anzuschrauben. Ich vermute, dass sich die extrapolierten Werte langsamer ändern werden.