PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Polynomfunktionen berechen lassen



Tryan
20.11.2008, 08:58
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

Jaecko
20.11.2008, 09:10
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.

Tryan
20.11.2008, 09:53
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

Jaecko
20.11.2008, 10:02
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, 10: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.

Tryan
20.11.2008, 11:07
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, 11: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

Tryan
20.11.2008, 12:19
Hallo mare_crisium,
leider funktioniert dein Programm so nicht. Man kann nur eine Rechenoperation pro Zeile machen...

mfg Tryan

mare_crisium
20.11.2008, 21: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

Tryan
21.11.2008, 16:13
Ja super danke mare_crisium,

so läuft das um Welten schneller ab.
Danke für den Tipp

Mfg Tryan

for_ro
21.11.2008, 22:13
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