hey ,
hab folgendes problem:
hab noch nie in meinem leben in basic programmiert und soll nun ein programm schreiben das das maximum einer funktion herrausfindet und zwar mit der methode " Aufstieg des kleinen mannes" und das denn grafisch darstellen.
ich hab mich schon da durchgefuchst und einiges hinbekommen jedoch bekomme ich es
1. nicht hin das die x- und y- schritte nacheinander durchgeführt werden, also das erst nur der x wert erhöht oder vermindert wird und danach denn der y- wert und dann wieder nur der x- wert und so weiter...
2. bekomme ich es nicht hin das die funktion abbricht wenn sich der Funktionswert nur noch minimal ändert. bei mir läuft er ja einfach die 100 schritte durch:(
vlt kann mir ja jmd helfen?!
wäre echt super, denn bin schon so weit gekommen und wäre super glücklich wenn ich das fertig bekommen würde:)
hier mein jetziges programm:
REM ***** BASIC *****
Option Explicit 'schaltet automatische Variablendeklariation ab
' deklarieren von öffentlichen Variablen
public oCalcDokument as Object
public oTabellenBlatt as Object
public oZelle as Object
'deklarieren der zu verwendenen Varaiblen
public a(5) as double
public funktionswert as double
public x, y as double
public x_schritt as double
public y_schritt as double
public schrittweite as double
public speicher(100) as double
public schrittzahl as integer
Sub MaximumSuche
' lokale Variablen deklarieren
Dim n as integer
' Festlegen der Schrittweite
schrittweite = 1
werte
'Berechnen der Formel
funktionswert = a(0) + a(1)*x + a(2)*x^2 + a(3)*y + a(4)*y^2 + a(5)*x*y
For n=1 to 100
'zählen der Schritte
schrittzahl = schrittzahl + 1
x_probe
y_probe
speicher(n) = funktionswert
'Beginn der schleife
if n >= 4 then
if speicher(n-4) = funktionswert then
schrittweite = schrittweite / 2
end if
end if
report
Next n
'Ausgabe in das Tabellenblatt
'holen des Tabellenblattes
oTabellenBlatt = oCalcDokument.Sheets(0)
'Ausgabe von z(x,y)
oZelle = oTabellenblatt.getCellbyPosition(1,3)
oZelle.VALUE = funktionswert
'Ausgabe vom x-Wert
oZelle = oTabellenblatt.getCellbyPosition(2,3)
oZelle.VALUE = x_schritt
'Ausgabe vom y-Wert
oZelle = oTabellenblatt.getCellbyPosition(3,3)
oZelle.VALUE = y_schritt
'Ausgabe des Ergebnisses auf dem Bildschirm
MsgBox "Maximum liegt bei " & funktionswert
End Sub
'_____________________________________________________________________ _________________________
'Damit alle Prozeduren und Funktionen die Werte weiter verarbeiten können, holt diese
'Funktion alle vom Benutzer eingegenen Werte und speichert diese in den öffentlichen Variablen.
Sub Werte
'deklarieren lokaler variablen
dim n as Integer
'holen des Dokumentes
oCalcDokument = ThisComponent
'holen des 2. Tabellenblattes (Parameter)
oTabellenblatt = oCalcDokument.Sheets(1)
'holen der Koeffizienten
for n = 0 to 5
oZelle = oTabellenblatt.getCellbyPosition(2,n+1)
a(n) = oZelle.VALUE
Next n
End Sub
'_____________________________________________________________________ ____________________________
'x_Probe berechnet die Probeschritte in + bzw. - x-Richtung und entscheidet ob eine
'Verbessrung vorhanden ist
Sub x_probe
' lokale Variablen deklarieren
dim x_wert as double
'Schritt in + x-Richutng
x = x_schritt + schrittweite
x_wert = a(0) + a(1)*x + a(2)*x*x + a(3)*y + a(4)*y*y +a(5)*x*y
'Beginn der Schleife
If x_wert < funktionswert then
x = x_schritt - schrittweite
x_wert = a(0) + a(1)*x + a(2)*x*x + a(3)*y + a(4)*y*y +a(5)*x*y
End if
' aktuellen x_schritt ausführen
x_schritt = x
' Übergabe von x_wert an den Funktionswert
funktionswert = x_wert
End Sub
'_____________________________________________________________________ _____________________________
'y_Probe berechnet die Probeschritte in + bzw. - y-Richtung und entscheidet ob eine
'Verbessrung vorhanden ist
Sub y_probe
'lokale Variable deklarieren
dim y_wert as double
'Schritt in + y-Richtung
y = y_schritt + schrittweite
y_wert = a(0) + a(1)*x + a(2)*x*x + a(3)*y + a(4)*y*y +a(5)*x*y
'Beginn der Schleife
If y_wert < funktionswert then
y = y_schritt - schrittweite
y_wert = a(0) + a(1)*x + a(2)*x*x + a(3)*y + a(4)*y*y +a(5)*x*y
End if
' aktuellen y_schritt ausführen
y_schritt = y
' Übergabe von y_wert an den Funktionswert
funktionswert = y_wert
End Sub
'_____________________________________________________________________ ________________________________
'Report gibt eine Report über jeden Schritt in das Tabellenblatt aus
Sub report
'Holen den Dokumentes
oCalcDokument = ThisComponent
'Holen des 1.Tabellenblattes
oTabellenblatt = oCalcDokument.Sheets(0)
'Ausgabe der Werte
'Ausgabe Anzahl der Schritte
oZelle = oTabellenblatt.getCellbyPosition(1,schrittzahl+5)
oZelle.VALUE = Schrittzahl
'Ausgabe X-Wert
oZelle = oTabellenblatt.getCellbyPosition(2,schrittzahl+5)
oZelle.VALUE = x_schritt
'Ausgabe Y-Wert
oZelle = oTabellenblatt.getCellbyPosition(3,schrittzahl+5)
oZelle.VALUE = y_schritt
'Ausgabe z(x,y)
oZelle = oTabellenblatt.getCellbyPosition(4,schrittzahl+5)
oZelle.VALUE = funktionswert
'Ausgabe der Schrittweite
oZelle = oTabellenblatt.getCellbyPosition(5,schrittzahl+5)
oZelle.VALUE = schrittweite
End Sub
'_____________________________________________________________________ _________________________
sub Diagramm_Maximumsuche
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$7:$D$106"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertObjectChart", "", 0, Array())
rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$I$4"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
end sub
cleo123 Gast |