30. januar 2004 - 16:41Der er
12 kommentarer og 1 løsning
Matematisk udregn- og grafvisning - Expontiel funktion F(x)=ba^x
Jeg er ved at lave et program, hvor der indtastes 3 værdier a,b,c,....hvor efter man vælger en "option" for hvilken matematisk formel man vil have....man vælger derefter at tegne grafen...i et picturefelt...
Problemet er når man skal have det til at lave grafen for en . Expontiel funktion F(x)=ba^x
selve picture feltet er 2D (X&Y)fra -10 til +10 i begge retninger....
koden der melder fejl
Public Sub TegnGraf(a, b, c As Double)
Dim X1, Y1 As Double
If Option3 = True Then For X1 = -10 To 10 Step 0.001 DoEvents Y1 = b * (a ^ X1) Picture1.PSet (X1, Y1), vbRed Next End If
når værdierne a og b er i plus så melder den runtime error '6' overflow.
når værdierne a og b er i minus så melder den runtime error '5' invalid procedure call or argument.
hvordan kan den laves så den kan komme til at virke?????
Med hensyn til runtime error 6 så bruger du for store tal i forhold til din picturebox :o)
Jeg kan ikke umiddelbart se hvorfor du får runtime 5, jeg har selv fremprovokeret den. Jeg er ikke det store matematiske geni, men jeg har ingen problemer med at få streger frem med nedenstående kode :o) Måske er det noget du kan bruge...
Private Sub Command1_Click() Dim X1, Y1, tal As Single a = 4: b = 4 Picture1.Line ((Picture1.ScaleWidth / 2), 0)-((Picture1.ScaleWidth / 2), (Picture1.ScaleHeight)), vbBlack ' Picture1.Line (0, (Picture1.ScaleHeight / 2))-((Picture1.ScaleWidth), (Picture1.ScaleHeight / 2)), vbBlack X2 = (Picture1.ScaleWidth / 2) Y2 = (Picture1.ScaleHeight / 2) For X1 = -10 To 10 Step 0.05 X2 = (Picture1.ScaleWidth / 2) Y2 = (Picture1.ScaleHeight / 2) DoEvents If a < 0 And X1 < 0 Then a = (a * (-1))
Y1 = b * (a ^ (X1)) x = X1 + X2: y = (Y1 * (-1)) + Y2 Picture1.PSet (x, y), vbRed DoEvents Next End Sub
Slut med fejlmeddelelser :o) - Eller rettere: ignorer dem...
Private Sub Command1_Click() Dim X1, Y1, tal As Single plac = 0 a = 1.4: b = 1.5 Picture1.Line ((Picture1.ScaleWidth / 2), 0)-((Picture1.ScaleWidth / 2), (Picture1.ScaleHeight)), vbBlack ' Picture1.Line (0, (Picture1.ScaleHeight / 2))-((Picture1.ScaleWidth), (Picture1.ScaleHeight / 2)), vbBlack X2 = (Picture1.ScaleWidth / 2) Y2 = (Picture1.ScaleHeight / 2) start = -20: slut = 25 For X1 = start To slut Step 0.05 On Error Resume Next DoEvents Y1 = b * (a ^ (X1)) x = ((X1 * 10) + X2): y = ((Y1 / 2) * (-1)) + Y2 'x = ((X1 * 10) + X2): y = (Y1 * (-1)) + Y2 If X1 <> start Then Picture1.Line (x3, y3)-(x, y), vbRed x3 = x: y3 = y DoEvents Next End Sub ... Eller med en label ....
Private Sub Command1_Click() Dim X1, Y1, tal As Single plac = 0 a = 1.4: b = 1.5 Label1 = "TEGNER" Picture1.Line ((Picture1.ScaleWidth / 2), 0)-((Picture1.ScaleWidth / 2), (Picture1.ScaleHeight)), vbBlack ' Picture1.Line (0, (Picture1.ScaleHeight / 2))-((Picture1.ScaleWidth), (Picture1.ScaleHeight / 2)), vbBlack X2 = (Picture1.ScaleWidth / 2) Y2 = (Picture1.ScaleHeight / 2) start = -20: slut = 25 For X1 = start To slut Step 0.05 On Error Resume Next DoEvents Y1 = b * (a ^ (X1)) x = ((X1 * 10) + X2): y = ((Y1 / 2) * (-1)) + Y2 'x = ((X1 * 10) + X2): y = (Y1 * (-1)) + Y2 If X1 <> start Then Picture1.Line (x3, y3)-(x, y), vbRed x3 = x: y3 = y DoEvents Next Label1 = "FÆRDIG" End Sub
Private Sub Form_Load() Label1 = "" End Sub
Ja undskyld jeg ved godt jeg vrøvler... Det vigtigste er at holde sig indenfor de, af systemet, tilladte rammer.
En formel der hedder noget i retning af Y1 = 9 * (8 ^(10)) bliver til en Y værdi på 9.663.676.416 eller noget i den retning. Det er svært at vise i en picturebox medmindre du gør noget ved resultatet, som du kan se jeg har gjort ovenfor med sætningen:
Jeg siger tak ...du har hjulpet mig med at få den til at regneg den ud inden for "feltet"...men der er bare et andet problem det er at en Expontiel funktion kan også vises som en minus funktion ...det kan din udregning ikke klarer når væredierne a og b er minus...derved vises finktionen som en lige steg på y-aksen...jeg ved godt det er et indviklet spørgsmål... -krazyunreal
nu skal du se jeg har jeg fået den til at tage minus værdier ....men løber ind i overflow '6' ved værdier
her er hele funktionen option 4 skal du ikke tage dig af ...
Public Sub TegnGraf(a, b, c As Double) Dim X1, Y1 As Double
If Option1 = True Then For X1 = -10 To 10 Step 0.01 DoEvents Y1 = a * X1 ^ 2 + b * X1 + c Picture1.PSet (X1, Y1), vbRed Next End If
If Option2 = True Then For X1 = -10 To 10 Step 0.01 DoEvents Y1 = a * X1 + b Picture1.PSet (X1, Y1), vbRed Next End If
If Option3 = True Then For X1 = -10 To 10 Step 0.01 DoEvents If a < 0 And X1 < 0 Then a = (a * (-1)) Y1 = b * (a ^ (X1)) Picture1.PSet (X1, Y1), vbRed Next End If
'If Option4 = True Then ' For X1 = -10 To 10 Step 0.01 ' DoEvents ' Y1 = -b * (X1) ^ a ' Picture1.PSet (X1, Y1), vbRed ' Next 'End If
End Sub
her er knappen der aktivere det hele Private Sub cmdtegncoordinatsystem_Click() If Check1 = 1 Then Picture1.Cls End If Picture1.Line (0, 10)-(0, -10), vbBlue Picture1.Line (10, 0)-(-10, 0), vbBlue Call TegnGraf(HScroll1.Value / 10, HScroll2.Value / 10, HScroll3.Value / 10)
End Sub
og her er load formen ...
Private Sub Form_Load() Picture1.Scale (-10, 10)-(10, -10) End Sub
det er kun inder option 3 vi kan ændre noget i koden ellers viker de andre formler ikke...det er formendelig også det du har forsøgt at forlarer mig...med .........."En formel der hedder noget i retning af Y1 = 9 * (8 ^(10)) bliver til en Y værdi på 9.663.676.416 eller noget i den retning. Det er svært at vise i en picturebox medmindre du gør noget ved resultatet, som du kan se jeg har gjort ovenfor med sætningen: x = ((X1 * 10) + X2): y = ((Y1 / 2) * (-1)) + Y2 "
Jeg tror du skulle prøve med : On Error Resume Next Bare sæt det ind som nedenfor :o) - Så har vi aflivet fejlmeddelelserne.
If Option3 = True Then For X1 = -10 To 10 Step 0.01 DoEvents On Error Resume Next If a < 0 And X1 < 0 Then a = (a * (-1)) Y1 = b * (a ^ (X1)) Picture1.PSet (X1, Y1), vbRed Next End If
Så kan du lege lidt med størrelsen på dit koordinatsystem... Det hjælper lidt på forståelsen - synes JEG :o) - Men jeg kan også godt lide at lege.
Jeg må jo indrømme, at det (IMHO) ser nogenlunde rigtigt ud når man bruger If a < 0 And X1 < 0 Then a = (a * (-1)) Men som jeg siger: Jeg er absolut ikke noget matematisk geni :o)
sådan!!! så virker det ..ved at sætte On Error Resume Next ind i formlen....
ang. "lege med størrelsen af koordiant systemet" ...er endelig en go ide men med hensyn til resten af det program jeg er ved at udvikle er det ikke en go ide..
med hensyn til brugen af: If a < 0 And X1 < 0 Then a = (a * (-1)) gør det at -gang minus bliver plud ...da man skal tænke på at når man har med grafer at gører så er der altid 2 resultaterer en i plus og en en i minus..men minus kan ikke vises da det ikke eksistere derved vendes fortegn og en grafisk visning opnåes...
ang. matematisk geni...- det går da meget godt ...
du skal da have dine point ...for det her det virker bare .... :O)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.