Archiv verlassen und diese Seite im Standarddesign anzeigen : Polynomfunktionen berechen lassen
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.
Meinst du so?
'---------------------------------
'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
Aber muss ich nicht auf Punkt- vor Strichrechnung achten?
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]
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
thewulf00
20.11.2008, 11:22
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
$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
Ich bin schon gespannt wie schnell der Atmega das berechnen kann, der Simulator ist ganz schön am Arbeiten....
Mfg Tryan
P.S. habe die überschrift geändert ;)
mare_crisium
20.11.2008, 12:50
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:
$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
Das müsste wesentlich fixer laufen ;-) !
Ciao,
mare_crisium
Hallo mare_crisium,
leider funktioniert dein Programm so nicht. Man kann nur eine Rechenoperation pro Zeile machen...
mfg Tryan
mare_crisium
20.11.2008, 22:40
Tyran,
aha, das wusste ich nicht. - Na, wenn ich die Methode an diese Beschränkung anpasse, kommt das hier heraus:
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
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 versuchen ;-) !
Ciao,
mare_crisium
Ja super danke mare_crisium,
so läuft das um Welten schneller ab.
Danke für den Tipp
Mfg Tryan
so läuft das um Welten schneller ab.
Schneller ja, nur hat das doch nichts mit der Berechnung zu tun, die du in deiner ersten Mail angegeben hast.
Schau dir mal an, wie Jaecko das umgesetzt hat, das stimmt (bis auf Tippfehler bei E-9).
Schnell und richtig wäre etwa so:
$crystal = 16000000
$regfile = "m128def.dat"
Dim X As Word , X1 As Long
Dim Y As Single , Y1 As Single , Y2 As Single , Y3 As Single , Z As Single
X = 1000
Do
Y = 0.00506 * X 'X^1
Y = Y + 0.01499
X1 = X * X 'X1 = X^2
Y1 = 0.0000018892 * X1
Y2 = -0.00000000014249 * X1
Y2 = Y2 * X 'X1 = X^3
Y3 = -0.000000000000020465 * X1
Y3 = Y3 * X1 'X1 = X^4
Y = Y + Y1
Y = Y + Y2
Y = Y + Y3
X = X + 1
Loop Until X = 1100
End
Braucht für 1000...7000 1,8sec bei 16MHz
Gruß
Rolf
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.