Unicalc Grafik - 3.0.0.3

  • Also,
    dieser Thread ist eine Art Fortführung zu diesem: Unicalc
    Dort hatte ich bereits angekündigt, den (doch sehr umfangreichen) Quellcode öffentlich zu machen. Das habe ich jetzt nur in gewisser Weise getan, da ich Unicalc als ganzes (mit Taschenrechner, Formelsammlung etc.) wahrscheinlich garnicht mehr weitermache. Ich habe jetzt ein einzelnes Programm gemacht, in dem nur noch die Grafik Funktion vorhanden ist, diese habe ich aber auch noch deutlich verbessert.
    So, kompletten Quellcode und alle Dateien, die man zum kompilieren braucht, sowie die fertige exe findet ihr hier: http://www.perfectsoft.tk
    Dort sind auch nochmal eine genauere Beschreibung des Programms und ein paar Screenshots zu sehen.

    Die Credits schreibe ich hier aber auch schonmal hin:
    Sebastian Neef - Französisch|Spanisch
    John Behm - Niederländisch
    James Brooks - Aero UDF
    Thomas Rupp - Translate UDF
    trancexx - Math Functions
    MrCreatoR - _GUICtrlTab_CoverBackground
    BugFix - _GUICtrlMenu_JustifyRight
    lod3n - SetBitmap
    Prog@ndy - _API_SetLayeredWindowAttributes
    JdeB - _INetSmtpMailCom
    AspirinJunkkue- Nullstellen / Extrema

    Auch habe ich mir bei Galenda die Sache mit der Lizenz ein wenig abgeschaut und Unicalc Grafik unter GPL3 gestellt.

    Feedback, Kritik und Verbesserungsvorschläge sind immer gerne erwünscht.
    Und wer noch weitere Sprachen kann und das Prgramm vielleicht mal übersetzen will, dem bin ich auch sehr dankbar. Es ist ja auch nicht wirklich viel zu übersetzen (siehe Source zip Languages). :)

    Und schon ist die 3.0.0.3 raus ^^

    Changelog :

    3.0.0.2 --> 3.0.0.3

    • Berechnen von Extrema eingebaut
    • Nullstellen und Extrema werden jetzt mit einem anderen Vefahren (Regula Falsi) berechnet (Danke an AspirinJunkie)
    • Beschriftungen auf den Achsen überlappen sich nicht mehr
    • n! entfernt
    • Internes Drucken eingebaut
    • Bug mit ln(x) gefixt (Hieß teilweise In(x))
    • Bug mit nicht korrekten bzw. nichtrechenbaren Funktionen gefixt (Siehe log(x))
    • Bug beim Editieren von Beschriftungen gefixt


    3.0.0.1 --> 3.0.0.2

    • Nullstellen werden jetzt berechnet (Danke an nuts)

    3.0.0.0 --> 3.0.0.1

    • Titel waren falsch (Grafik anstatt Unicalc Grafik etc.)
    • Exp() Funktion ist jetzt richtig.


    Ludwig

    7 Mal editiert, zuletzt von Ludwig (6. Mai 2010 um 21:40)

    • Offizieller Beitrag

    Hallo

    Wow, Respekt! Einer der größten Projekte, die ich mit AutoIt bisher gesehen habe.
    Schönes Design, saubere Verarbeitung und weitaus einfacher zu Bedienen als Derive ;)

    Leider habe ich noch ein Fehler im Design, bei mir sieht es so aus:
    autoit.de/wcf/attachment/7308/
    Ne Idee?

    OS: Win7, Up2Date

    Ich werde das Projekt auf jeden Fall verfolgen, sieht wirklich viel versprechend aus :)

    Gruß
    Spider

  • irgendwie hab ich voll die Design fehler...bei mir steht nur support/feedback und das Koordinatensystem, jedoch nicht diese "office 2010" leiste...

    ach ja...ich würde das passwort deiner email ändern, weil es ist schon sehr riskant dass jemand damit blödsinn macht, obwohl da steht bitte nicht missbrauchen...

  • Tja, danke erstmal ne ...
    Das mit dem Design hatte ich schon des öfteren. An meinem PC ist es nie so, aber iauf anderen öfters. Hast du x64 oder x86 ? Weil bei meinem Bruder war das immer mit dem schwarz und der hat x64, deshalb hab ich das Aero-Design auch bei x64 standartmäßig ausgestellt, allerdings weiß ich nicht ob es wirklich daran liegt.

    @Reaker:
    Könntest du bitte einen Screenshot anhängen ?
    Und das mit der Email Adresse... die ist NUR für dieses Programm. Sonst nutz ich die garnicht, und ich weiß auch nicht was einer da groß missbrauchen kann oder will...

    Ludwig

  • ehm ja, lass mich raten:
    Du hast das Script ausgeführt ohne die Ordner in _FileInstall zu ändern.
    Die musst du auf deinen Pfad anpassen, dann sollte es gehen.

  • Hm ... dann weiß ich echt nicht woran es liegt. Bei einem Freund von mir der Vista hatte ging es mit dem neuesten Service Pack weg, aber wenn du win7 x86 mit neuesten updates hast ... (hab ich auch) dann hab ich echt keine ahnung

  • Kleiner Fehler: Beim Rauszoomen (Mapeinheit cm) überschneiden sich die Bezeichnungen auf der X-Achse.
    Vielleicht sollte die Maßeinheit auch nicht direkt bei der "Zahl" stehen.

    Ansonsten wirklich toll gemacht! :thumbup:

    edit \ Funktionen zur Kurvendiskussion (Nullstellen, Hoch- Tiefpunkte usw.) gibts noch nicht oder?

  • hm
    Naja deshalb hab ich ja gemacht, dass man die Zahlen und so auf den Achsen selbst bestimmen kann.

    Und zu Kurvendiskussionen: Ich habs nicht reingebaut weil ich nicht wirklich weiß, was das ist. Ich bin in der 10. Klasse und hatte das einfach noch nicht. Aber wenn mir jemand dabei helfen will ... ich nehm alles dankbar entgegen.

  • Oha sehe gerade dein Geburtsdatum. Wahnsinns Skript für dein Alter. :thumbup:

    Bei der Kurvendiskussion (so wurde das bei uns in der Schule genannt) geht es ähm (lang lang ists her) um bestimmte Punkte der Gleichung.
    z.B.
    Nullstellen (y = x hat die Nullstelle 0:0)
    Hochpunkte (y=x^2 hat den Tiefpunkt 0:0)
    Wendepunkt (y=x^3 hat den Wendepunkt 0:0)
    usw.
    Ist mathematsich eigentlich relativ einfach, in Code zu fassen schon schwerer.
    Gibt dir aber ein Riesenvorsprung für die Oberstufe :thumbup:

    Kann dir ja mal ein Beispiel dazu machen.

  • Hab was im Archiv gefunden (ist nicht von mir).

    Spoiler anzeigen
    [autoit]


    ; Utilty that utilizes Newton's method to find solutions to equations
    ; See http://en.wikipedia.org/wiki/Newton%27s_method for an explanation of the math.
    ; by Diego Hernandez < d (dot) hernandez 0 9 at g mail >

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>
    #include <String.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet ("{ESC}", "Terminate") ; press ESC to emergency-exit

    [/autoit] [autoit][/autoit] [autoit]

    Local $expression = InputBox ("Enter equation", "E.g. x^2=16", "x^2=16") ; make sure you use * to multiply
    If @error Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    $expression = "&" & $expression & "&"
    $right_side = _StringBetween ($expression, "=", "&")
    $left_side = _StringBetween ($expression, "&", "=")
    $expression = $left_side[0] & " - (" & $right_side[0] & ")" ; one side of the equation is now 0; now apply Newton's method.

    [/autoit] [autoit][/autoit] [autoit]

    Local $x_guesses_array[2] ; every 2000 iterations (this is more than enough in many cases) the program will compare
    ; the values for the root and if it has converged enough, it will display the answer in a MsgBox.
    $x_guess = Number(InputBox ("Enter approximation for root", "Enter a guess reasonably close to the root so Newton's method can converge properly. Thank you!","1"))
    ; The program will find the root closest to your initial guess. If it is complex, it will enter into an infinite cycle.
    $c = 0

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $x_guess = $x_guess - (_Fx($expression, $x_guess)/_SlopeOfTangent($expression, $x_guess))
    ; see http://en.wikipedia.org/wiki/Newton%27s_method for an explanation of the math behind Newton's method
    $c +=1
    If IsInt ($c/1000) = 1 and IsInt ($c/2000) = 0 Then
    $x_guesses_array[0] = $x_guess
    $x_guesses_array[1] = 0
    EndIf
    If IsInt ($c/2000) Then
    ; every 2000 iterations, the program will compare its current x value with the x-value stored from the previous 1000th iteration.
    ; if they are close enough, the root has been sufficiently determined. It will ExitLoop and display the root.
    $x_guesses_array[1] = $x_guess
    ; _ArrayDisplay ($x_guesses_array)
    If Abs($x_guesses_array[1] - $x_guesses_array[0]) < 0.001 Then ExitLoop
    EndIf
    If $c >= 10000 Then
    MsgBox (0, "Message", "You have reached a complex root or other weird occurrence. Please try again with a different initial guess. Thank you!")
    Exit ; I have tried to make it user-friendly
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox (0, "Solution", Round($x_guess, 4))

    [/autoit] [autoit][/autoit] [autoit]

    Func Terminate ()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SlopeOfTangent($expr, $at_point, $var = "x", $places=4)
    Local $dx = 0.00000001
    Local $x = $at_point
    Local $y = $x + $dx
    Local $slope = Execute(StringReplace($expr,$var,"$y")) - Execute(StringReplace($expr,$var,"$x"))
    Return Round($slope/$dx,$places)
    EndFunc ;_SlopeOfTangent()==>

    [/autoit] [autoit][/autoit] [autoit]

    Func _Fx ($expr, $at_point)
    Return Execute (StringReplace($expr, "x", "$at_point"))
    EndFunc

    [/autoit]


    Das Newtonverfahren zum Annähern der lokalen Nullstelle.

  • Danke :)

    das mit den Nullstellen sieht sehr unübersichtlich aus. Es scheint ja quasi mit Tangenten, die sich dann immer näher an die nächste Nullstelle schieben, zu gehen. Aber das ist doch dann nur für eine Nullstelle ... was ist, wenn die Funktion mehrere hat. Und außerdem soll der Benutzer ja nicht immer einen Vorschlag angeben müssen. Naja, ich bin ja schon froh, dass ich Tangenten geschafft hab (zwar auch nur durch annähern aber immerhin ...).

    Achso: Mir ist gerade aufgefallen, dass die Flächenberechnung für Vielecke nicht immer ganz richtig ist. Nämlich dann nicht, wenn sich die Ecken "überlappen". Ich mach das ja mit der Gaußsche Trapezformel:

    Zeile 4915:

    [autoit]


    For $X = 1 To $iPoints[0][0]
    If $X = $iPoints[0][0] Then
    $X1 = 1
    Else
    $X1 = $X+1
    EndIf
    If $X = 1 Then
    $X2 = $iPoints[0][0]
    Else
    $X2 = $X-1
    EndIf
    $iFlaeche += $iPoints[$X][0] * ($iPoints[$X1][1] - $iPoints[$X2][1])
    Next
    $iFlaeche = Abs($iFlaeche / 2)

    [/autoit]

    hat jemand eine Ahnung, wie ich das beheben könnte ?

  • Klar es wird nur die lokale Nullstelle berechnet.
    Für diese Unzulänglichkeit müsste sich dein Rechner nicht schämen, denn mein grafischer Taschenrechner (TI-83 Plus) kann auch nicht mehr ;)

    Eine Kurvendiskussion die automatisch alle interessanten Punkte ohne näheres eingrenzen bestimmt wird sehr sehr schwer (s. Theorie zu den Extremstellen).

    Einmal editiert, zuletzt von nuts (12. Januar 2010 um 22:30)

  • Okay. Schämen würde er sich eh nicht, weil zur Zeit ist es ja garnicht drin und dann wäre immerhin etwas mehr, so oder so ein Fortschritt. Aber mir ist das zur Zeit zu viel Arbeit. Wenn jemand anderes daran interesse hat: immer gerne, oder gibt es vielleicht schon eine Art Funktionssammlung für Kurvendiskussionen ? Das wäre das optimalste, ich werd mal suchen. Aber ich mach jetzt lieber noch was an der Oberfläche und der Darstellung, z.B. das was du schon genannt hattest mit dem rauszoomen und den Beschriftungen der Achsen (das ärgerliche ist dass ich das eigentlich schon richtig hatte nur ist das script weg ... hatte nur noch ein eine woche altes Backup :pinch: )

    mfg
    Ludwig

  • Klar es wird nur die lokale Nullstelle berechnet.
    Für diese Unzulänglichkeit müsste sich dein Rechner nicht schämen, denn mein grafischer Taschenrechner (TI-83 Plus) kann auch nicht mehr ;)

    Eine Kurvendiskussion die automatisch alle interessanten Punkte ohne näheres eingrenzen bestimmt wird sehr sehr schwer (s. Theorie zu den Extremstellen).

    Für die Nullstellen beispielsweise wäre es doch auch nicht schwer.
    Man hat durch die Grafik ja einen Definitionsbereich vorgegeben.
    Den geht man einfach in gewissen x-Schritten durch und wenn sich zwischen 2 aufeinanderfolgenden Stellen das Vorzeichen bei den Werten ändert so muss dazwischen eine Nullstelle sein.
    Dann hat man damit auch gleich 2 Grenzen für die Nullstellensuche.
    Ob man dann Newton oder ein anderes Verfahren anwendet is ja dann egal.
    Zumindestens sollte man so alle Nullstellen im Definitionsbereich aufspüren können.
    Vorausgesetzt die Schrittweite ist kleiner als der minimalste Abstand 2er Nullstellen.

  • Joa das wäre auch eine sehr gute (und einfachere) methode. Dann würde er zwar auch nur gewisse Nullstellen finden aber das ist ja trotzdem besser als nichts.
    Und für die anderen Aspekte ? Hochpunkte, Wendepunkte ? Das wäre auch interessant. Vlt hat ja da jemand eine Idee ?

    Ludwig