Hi,
ist es möglich Polynomfunktionen von einen Atmega berechnen zu lassen?
wie z.b.
y = 0.01499 + 0.00506*x + 1.8892E-6*x^2 + -14249E-10*x^3 + -2.0465E-14*x^4
x = 1000 bis 7000
Lg Tryan
Hi,
ist es möglich Polynomfunktionen von einen Atmega berechnen zu lassen?
wie z.b.
y = 0.01499 + 0.00506*x + 1.8892E-6*x^2 + -14249E-10*x^3 + -2.0465E-14*x^4
x = 1000 bis 7000
Lg Tryan
Wenn man's geschickt anstellt, sollte es schon möglich sein.
Wenns in Bascom gemacht wird, wirds aber in einer Zeile nicht gehen.
Da brauchst du für jede Operation ne extra Zeile.
Also für y = ... wärens 11 Zeilen wenn ich mich nicht verzählt hab.
Falls Bascom x^4 nicht kennt und was in der Art x*x*x*x erwartet wärens 14.
Je nach Reihenfolge sollte man Rundungsfehler minimieren können.
#ifndef MfG
#define MfG
Meinst du so?
Aber muss ich nicht auf Punkt- vor Strichrechnung achten?Code:'--------------------------------- 'Deklaration '--------------------------------- $regfile = "m16DEF.DAT" $crystal = 16000000 Config Porta = Output Dim Kw As long Dim X As Integer Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 Config Lcd = 20 * 4 Initlcd Cls Cursor Off X = 2000 Do Kw = 0.1499 + 0.00506 Kw = Kw * X Kw = Kw + 0.000001889 Kw = Kw * X Kw = Kw ^ 2 Kw = Kw - 0.00000000014249 Kw = Kw * X Kw = Kw ^ 3 Kw = Kw - 0.00000000000020465 Kw = Kw * X Kw = Kw ^ 4 Lcd Kw Loop End
Mfg Tryan
eher nicht.
Da du beim ersten mal "Kw = Kw * X" nicht mehr das berechnest, was du willst. Es wäre dann vergleichbar mit dem:
y = (0.01499 + 0.00506) *x ... also der Wert 0.01499 kriegt auch ein x verpasst.
Deine Formel sähe demnach so aus:
Kw = (((((((((((0.1499 + 0.00506) * x) + 0.000001889) * x) ^2 ) -0.00000000014249)*x ) ^3 ) - 0.00000000000020465)*x)^4)
Ergibt irgendwas mit x^40 am Ende.
"Übersichtlicher" wäre es, wenn wirklich einzelne Variablen verwendet werden. Braucht halt einiges mehr an Speicher.
Wäre in etwa so:
[Variablentypen nach Bedarf, Annahme x^y wird von Bascom akzeptiert]
Code:a = 0.01499 b = 0.00506 * x c1 = x^2 c2 = c1 * 1.8892E-9 (falls Bascom die E-Schreibweise versteht; ist schon länger her) d1 = x^3 d2 = d1 * -14249E-10 e1 = x^4 e2 = e1 * -2.0465E-14 y = a + b y = y + c2 y = y + d2 y = y + e2
#ifndef MfG
#define MfG
Hallo,
ich wollte noch zu bedenken geben, dass Du den Begriff "komplexe Funktion" bitte nicht verwenden solltest, da es in der Mathematik dabei um was völlig anderes geht...
Das, was Du suchst, sind Polynomfunktionen.
Vielen Dank, also im Simulator läuft das Programm
Ich bin schon gespannt wie schnell der Atmega das berechnen kann, der Simulator ist ganz schön am Arbeiten....Code:$regfile = "m16DEF.DAT" $crystal = 16000000 Dim Y As Single Dim X As Single Dim A As Single Dim B As Single Dim C1 As Single Dim C2 As Single Dim D1 As Single Dim D2 As Single Dim E1 As Single Dim E2 As Single X = 1000 Do A = 0.01499 B = 0.00506 * X C1 = X ^ 2 C2 = C1 * 0.00000188 D1 = X ^ 3 D2 = D1 * -0.00000000014249 E1 = X ^ 4 E2 = E1 * -0.000000000000020465 Y = A + B Y = Y + C2 Y = Y + D2 Y = Y + E2 Loop End
Mfg Tryan
P.S. habe die überschrift geändert![]()
Tyran,
mit den wenigsten Rechenoperationen und der kleinsten möglichen Anzahl von Variablen kommst Du so hin, wenn Du die klassische Programmierung aus dem Lehrbuch verwendest:
Das müsste wesentlich fixer laufenCode:$regfile = "m16DEF.DAT" $crystal = 16000000 Dim Y As Single Dim X As Single X = 1000 Y = -0.000000000000020465 Y = -0.00000000014249 + Y*X Y = 0.00000188 + Y*X Y = 0.00506 + Y*X Y = 0.01499 + Y*X End!
Ciao,
mare_crisium
Hallo mare_crisium,
leider funktioniert dein Programm so nicht. Man kann nur eine Rechenoperation pro Zeile machen...
mfg Tryan
Tyran,
aha, das wusste ich nicht. - Na, wenn ich die Methode an diese Beschränkung anpasse, kommt das hier heraus:
Das sind dann auch schon 8 Zeilen. Ob das dann noch schneller als Deine Methode ist, hängt davon ab, wieviel Zeit die (X^n)-Operation braucht. Kannst's ja mal versuchenCode:Dim Y As Single Dim X As Single X = 1000 Y = -0.000000000000020465*X Y = -0.00000000014249 + Y Y = Y*X Y = 0.00000188 + Y Y = Y*X Y = 0.00506 + Y Y = Y*X Y = 0.01499 + Y End!
Ciao,
mare_crisium
Ja super danke mare_crisium,
so läuft das um Welten schneller ab.
Danke für den Tipp
Mfg Tryan
Lesezeichen