Avatar billede krazyunreal Nybegynder
30. januar 2004 - 16:41 Der 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?????
Avatar billede mikker Nybegynder
01. februar 2004 - 21:34 #1
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

- Mikker
Avatar billede mikker Nybegynder
01. februar 2004 - 21:39 #2
Lad mig lige understrege at løsningen ikke kan bruges matematisk.. Det er kun som en hjælp til at få aflivet fejlmeddelelserne. :o)
Avatar billede mikker Nybegynder
01. februar 2004 - 22:02 #3
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:

x = ((X1 * 10) + X2): y = ((Y1 / 2) * (-1)) + Y2


- Mikker
Avatar billede krazyunreal Nybegynder
02. februar 2004 - 12:50 #4
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
Avatar billede krazyunreal Nybegynder
02. februar 2004 - 13:21 #5
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  "

tror bare ikke jeg er med
Avatar billede mikker Nybegynder
02. februar 2004 - 18:20 #6
Okay - den der med Picture1.scale har jeg sq aldrig brugt før - den er da smart :o)

Dog må jeg stadig protestere imod at bruge sætningen:

        If a < 0 And X1 < 0 Then a = (a * (-1))

Jeg kigger på det og vender tilbage

- Mikker
Avatar billede mikker Nybegynder
02. februar 2004 - 18:25 #7
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
Avatar billede mikker Nybegynder
02. februar 2004 - 18:37 #8
Nu ved jeg godt at jeg laver lidt om på det hele igen...

Men prøv for sjov det her:

Private Sub Form_Load()
  xmax = 100: ymax = 100
  Picture1.Scale ((xmax * (-1)), ymax)-(xmax, (ymax * (-1)))
      'Picture1.Line (0, ymax)-(0, (ymax * (-1))), vbBlue
      'Picture1.Line (xmax, 0)-((xmax * (-1)), 0), vbBlue
        Picture1.Line (0, 10)-(0, -10), vbBlue
        Picture1.Line (10, 0)-(-10, 0), vbBlue
End Sub

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)

Anyway - jeg får ingen fejlmeddelelser længere...

- Mikker
Avatar billede krazyunreal Nybegynder
02. februar 2004 - 19:51 #9
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)
Avatar billede mikker Nybegynder
02. februar 2004 - 21:01 #10
Hvis du mener problemet er løst :o)

Tak fordi jeg måtte lege med...

- Mikker
Avatar billede krazyunreal Nybegynder
02. februar 2004 - 21:05 #11
det vil jeg mene det er ellers kommer jeg igen ..heheh
Avatar billede krazyunreal Nybegynder
02. februar 2004 - 21:06 #12
tak for hjælpen...!!..
-krazyunreal
Avatar billede mikker Nybegynder
03. februar 2004 - 06:20 #13
Vi er her for at hjælpe hinanden...

- Mikker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester