Beiträge von uuchip

    Die von AspirinJunkie eingestellte Yacas dll nutze ich auch sehr oft, z.B. zum Rechnen mit großen Zahlen. Mann kann die Verwendung mit AutoItSetOption ( "ExpandVarStrings",1) noch ein wenig vereinfachen, denn dann kann man ohne lästiges '&' die Variablen direkt z.B mit "$x$*$y$" nach Yacas senden.


    Besten Gruß


    P.S.: Yacas wir wieder weiter entwickelt, leider haben die neuen DLL eine andere Struktur mit der ich nicht klar komme, wäre das nicht ein Projekt für die Fachleute?

    Hallo lep230,


    ich glaube das OpenCascade und Salome für Deine Zwecke viel zu mächtig sind. Versuche es erst mal mit der OpenGL UDFs (2.0). Mit dieser UDF kann man u.a. auch Punkte vernetzen, und das Netz, was leicht aus STL Daten generiert werden kann, mit beliebigen Texturen und Farben in Echtzeit darstellen.


    Besten Gruß

    Hallo Zusammen,


    ich experimentiere gerade etwas mit tollen AutoItObject und habe dazu eine Anfängerfrage, nämlich wie bette ich Objekte in Objekte ein? Hier mal mein erfolgloser Versuch:

    #include "AutoitObject.au3"


    _AutoItObject_Startup()
    ; einfachstes Objekt
    Func _Object_1()
    Local $oClassObject = _AutoItObject_Class()
    $oClassObject.Create()
    $oClassObject.AddProperty("x")
    $oClassObject.AddDestructor("_DestructorForSomeObject")
    Return $oClassObject.Object
    EndFunc


    ; einfache vererbung funktioniert
    Func _Object_2()
    Local $oClassObject = _AutoItObject_Class()
    $oClassObject.Create(_Object_1())
    $oClassObject.AddProperty("y")
    $oClassObject.AddDestructor("_DestructorForSomeObject")
    Return $oClassObject.Object
    EndFunc


    ; einbetten von objekten geht so nicht!
    Func _Object_3()
    Local $oClassObject = _AutoItObject_Class()
    Local $test = _Object_1()
    $oClassObject.Create()
    $oClassObject.AddProperty($test)
    $oClassObject.AddDestructor("_DestructorForSomeObject")
    Return $oClassObject.Object
    EndFunc


    $oTest1 = _Object_1()
    $oTest2 = _Object_2()
    $oTest3 = _Object_3()



    $oTest1.x = 4711
    $oTest2.y = 815
    $oTest3.test.x = 7



    consolewrite($oTest1.x&@CRLF)
    consolewrite($oTest2.y&@CRLF)
    consolewrite($oTest3.test.x&@CRLF)


    Vielen Dank für die Hilfe und beste Grüße
    uuchip

    Hallo und guten Tag,


    für eine technische (mehr oder weniger) Bastelei benötige ich die volle Funktionalität des AutoIt Interpreters, der spätere Benutzer soll alle Autoitfunktionen sowie spezielle UDF nutzen können und zwar dynamisch so wie er es gerade braucht. (D.h. ein Compile Script to exe wäre nicht hilfreich).


    Fragen dazu:
    - Kann bzw. darf man den Interpreter (und die Standard UDF) als Bestandteil eines einfachen Installationspakete benutzen, ohne das man AU3 komplett installieren muss?
    - Gibt es evtl. schon ein Tool, das aus bestehenden allgemeinen eigenen UDF (die man nicht als Ganzes weitergeben möchte) nur die Funktionen automatisch raus filtert die man für die speziellen UDF benötigt? (Beispiel: In einer eigenen Mathe UDF sind X Funktionen vorhanden, von denen aber eine weitere UDF nur eine Teilmenge benötigt)
    - Wenn man die Funktionen der UDFs noch verschlüsseln könnte wäre das auch nicht schlecht, geht das grundsätzlich?


    Vielen Dank. Mit freundlichen Grüßen
    uuchip

    Moin Moin,


    ich an Deiner stelle würde das Rad nicht zum x-ten mal neu erfinden sondern z.B. die yacas dll einbinden.
    Ein kleiner Fred dazu
    Hier gibts es die DLL
    Ein kleiner Überbklick wie yacas mit complexen Zahlen arbeitet


    Ein (kleines) Problem wird sein, die DLL Output entsprechend zu "parsen". Aber das ist IMO reine String- Akrobatik, und die beherrscht AU3 sehr gut, im Gegensatz zum erstellen von eigenen Typen oder (noch besser) Objekten/ Methoden.


    Grüße
    uuchip


    P.S.: Wenn man unbedingt selber was basteln möchtest, wirf mal eine Blick auf
    http://autoit.de/index.php?page=Thread&threadID=17920



    Hallo AspirinJunkie & progandy und die anderen,


    herzlichen Dank für die Lösung! :):):)
    Und weil man hier so "gut geholfen bekommt", werde ich autoit natürlich nicht untreu!


    Megens Grüße
    uuchip


    P.S.: Wie gesagt die Lösung hat evtl. auch Bedeutung für andere Programmierer die sich mit Mathe beschäftigen. yacas ist zwar kein maxima oder maple aber doch verdammt leistungsfähig, ich würde mal behaupten es kann mehr als man in der Oberstufe Matheleistung so braucht


    P.P.S.: Ich brauch's für http://projecteuler.net/, dieser link sei jedem empfohlen der gerne programmiert und knobelt.

    [quote='Techmix','index.php?page=Thread&postID=252758#post252758']Nabend!
    Auf dem ersten Blick würde ich sagen, das du die Globale Variable VOR allen Funktionen Deklarieren mußt.


    Moin Moin,


    danke für die Antwort, aber daran liegt es leider nicht, in AU3 kann "global" auch in einer Funktion stehen. Und grundsätzlich wird die yacasdll.dll ja auch aufgerufen nur die Datenübergabe an yacas_eval klappt leider nicht. Ich denke/ glaube das diese Funktion einen Pointer auf einen null terminierten string erwartet (pchar) aber ich bekomme es nicht auf die Reihe, z.B.

    Code
    $struct_Buffer = DllStructCreate("char[80]");
    DllStructSetData($struct_Buffer,1,$s)
    $re = dllcall($dllh,"none","yacas_eval","ptr:cdecl",DllStructGetPtr($struct_Buffer))


    funzt auch nicht. ?(


    Wenn das weiter so geht, werde ich autoit untreu und code wieder in freepascal ;-)


    Gruß
    uuchip


    P.S.: Kann man eigentlich Funktionen einer dll über eine zweite dll aufgrufen? Wenn das funktionieren würde bastle ich mir eine Interface dll für yacas mit freepascal

    Hallo Zusammen,


    meiner einer wäre sehr dankbar wenn hier ein "DLL Kündiger" antworten würde.


    Das Problem, ich möchte die yacasdll.dll unter Autoit3 nutzen, aber es funktioniert leider nicht so wie erhofft. Die Problemlösung ist evtl. auch für andere Leute interessant weil yacas ein kleines aber IMO mächtiges Computer Algebra System ist.
    (Allgemeine info zu yacas, und hier gibts es die DLL)


    Unter freepascal sieht eine lauffähige Lösung so aus:


    Normalerweise wäre es kein Problem das in Autoit um zu setzten, dachte ich :-(


    Die yacas_init und yacas_result Funktion funktionieren auch in AU3, leider aber das wichtige yacas_eval nicht.
    Bach einiger Überlegung glaube ich, dass der Grund dafür ist, dass der C Ausdruck "YACASDLL_API void yacas_eval(char* expression)" keinen "str:cdecl" erwartet sondern einen Pointer auf einen char oder so etwas ähnliches. Ich steh nun wie der Ochs vorm Berg weil, 1. der freepascal compiler es scheinbar auch ohne pointer aufrufen kann, und ich mich mit den DllStructCreate und DllStructSetData gedönse in AU3, besonders wenn pointer im Spiel sind leider gar nicht auskenne.


    Vielen Dank. Mit freundlichen Grüßen
    uuchip

    Bekomme leider folgende Fehlermeldung:

    Code
    matrix00.au3(54,24) : ERROR: NumLn(): undefined function.
    $m = NumLn($filename)


    Wenn man nur den solver nutzt wird diese Funktion nicht gebraucht( oder doch???). Evtl. tritt der Fehler auf wenn man die anderen Funktionen aus matrix00.au3 nutzen will? Bitte durch "$m=_FileCountLines($filename)" ersetzen.


    Können auch überbestimmte Systeme damit gelöst werden?


    In der jetzigen Form leider nicht, weil für jeden Iterationsschritt die inverse Jacobi- Matrix schnöde nach Gauß berechnet wird. Daraus folgt n Unbekannte benötigen nun mal genau n Gleichungen.
    Gruß
    uuchip

    Hallo Zusammen,


    wer wollte nicht schon immer mal nichtlineare mehrdimensionale Gleichungen nummerisch lösen? ;)


    Weil ich es manchmal beruflich benötige, habe ich mir mit AU3 eine relativ einfache Lösung gebastelt, diese ist evtl. auch für andere Leute brauchbar, denn wenn man es ein wenig aufhübscht könnte man so etwas wie den M$ Excel Solver damit programmieren.


    Hier ein Beispiel Programm:
    #include "solver01.au3"


    ; Weitere Infos unter http://de.wikipedia.org/wiki/N…hren_im_Mehrdimensionalen


    ; Gleichungssystem 1 aus "fa1.csv"
    ; x1^2-2*x2=10
    ; sin(x1)+4*x2=20;
    dim $a[1][1], $b[1][1], $x[1][1], $D[1][1]
    csv2Fmatrix("fa1.csv",$a,$b)
    erzeuge0Matrix($x,$a[1][0],1)
    ; Startwerte für Iteration
    $x[1][1]=10
    $x[2][1]=10
    ; Mehrdimensionale Lösung nach Newton
    $x=solverM($a,$b,$x,1E-3,200,1E-5)
    _arraydisplay($x, "Eine Lösung für x1=$x[1][1], x2=$x[2][1]")
    ; Probe
    msgbox(0,"x1^2-2*x2=10",$x[1][1]^2-2*$x[2][1]&"=10")
    msgbox(0,"sin(x1)+4*x2=20",sin($x[1][1])+4*$x[2][1]&"=20")


    ; Gleichungssystem 2 aus "fa2.csv"
    ; x1/x3+2*x2+x3=10
    ; x1+4*x2+x3*x1=5
    ; x1^2+x2+x3=1
    dim $a[1][1], $b[1][1], $x[1][1], $D[1][1]
    csv2Fmatrix("fa2.csv",$a,$b)
    erzeuge0Matrix($x,$a[1][0],1)
    ; Startwerte für Iteration
    $x[1][1]=1
    $x[2][1]=1
    $x[3][1]=1
    ; Mehrdimensionale Lösung nach Newton
    $x=solverM($a,$b,$x,1E-3,200,1E-6)
    _arraydisplay($x, "Eine Lösung für x1=$x[1][1], x2=$x[2][1], x3=$x[3][1]")
    msgbox(0,"x1/x3+2*x2+x3=10",$x[1][1]/$x[3][1]-2*$x[2][1]+$x[3][1]&"=10")
    msgbox(0,"x1+4*x2+x3*x1=5",$x[1][1]+4*$x[2][1]+$x[3][1]*$x[1][1]&"=5")
    msgbox(0,"x1^2+x2+x3=1",$x[1][1]^2+$x[2][1]+$x[3][1]&"=1")


    Alles weiter (die benötigten units und die csv Beispiel Dateien) im Anhang!


    Bei der Nutzung bitte beachten:
    - Lösung muss vollständig im Bereich der Reellen-Zahlen liegen!!!
    - Es wird immer nur eine Lösung gefunden
    - Diese Lösung kann je nach Startwert verschieden sein

    Weitere Infos unter
    http://de.wikipedia.org/wiki/N…hren_im_Mehrdimensionalen


    Gruß
    uuchip

    Dateien

    • solver01a.zip

      (6,27 kB, 201 Mal heruntergeladen, zuletzt: )

    Du hast zwar nicht wirklich geschrieben wofür du das brauchst und wo deine lange Zahl herkommt (eigtl sollte die sowieso als String vorliegen, denn Autoit selbst erzeugt keine integer die das Maximum überschreiten), aber du kannst auch mal nach der bignum.au3 suchen, vielleicht löst die ja dein Problem.


    BigInteger UDF


    Ich bearbeite z.Z. das Problem 55 von Euler.net. Zum finden der Lösung mit AutoIt (ist gerade fertig, bei Interesse poste ich das mal) ist die bignum UDF sehr hilfreich. Aber auch die funktioniert nur richtig wenn man die ganz großen Zahlen als string eingibt.


    z.B. _bignum_add(<große Zahl 1>,<große Zahl 2>) ist ungleich
    _bignum_add("<große Zahl 1>","<große Zahl 2>")

    Na überlegt doch mal, welche Zahlen maximal in AutoIt angezeigt werden. (Integer) :whistling:
    Wer es ohne Überlegen testen will: Einfach in einer Schleife mit Ziffer 9 beginnen (ConsoleWrite) und die Zahl jeweils um eine 9 ergänzen.
    Ich glaube, dann wird klar warum die Stringlänge nicht stimmen kann.


    ok, ist klar. Aber meiner einer braucht die große Zahl nicht als Zahl sondern als Zeichenkette und ich dachte string erzwingt eine Umwandlung.


    Gruß
    uuchip

    keine ahnung, aber ich habe da nochetwas interessantes rausgefunden, was ich mir auch nicht erklären kann, nämlich das hier:


    Hallo,


    es scheint so, als ob AutoIt versucht trotz der Funktion string die "Eingabe" als Zahl zu interpretieren, und da ist bei max. 19 Stellen "Ende im Gelände". Wenn man ein "&" dazwischen bringt funktioniert es. Aber eine Variable auf zu eine Tour zu bearbeiten wird schwierig weil z.B. stringlen nicht funktioniert.


    Gruß
    uuchip


    Code
    msgbox(0,"Funktion &", stringlen(4668731596684&224866951378664))

    Hallo und guten Morgen,


    kann mir evtl. ein/e Kundige/r sagen warum nachfolgende Auswertungen mit stringlen nicht die gleichen Ergebnisse bringen?


    Vielen Dank. MfG
    uuchip


    Code
    msgbox(0,"Funktion string", stringlen(string(4668731596684224866951378664)))
    msgbox(0,'Funktion ""', stringlen("4668731596684224866951378664"))