Algorithmen, Teil IX.: Computer und andere Haustiere

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Abt. Flattermann
      ===========
      Am 28. Juni 2011 veröffentlichte ein ungenannter Highschool-Teacher eine Formel auf reddit.com, die rasch viele Klicks und einen hohen Belanntheitsgrad unter "Schundheftl-Konsumenten" und Mathe-Freaks erlangte. Daraus entwickelte sich anschließend eine "neue Kunstform" Character curves. Nachstehen meine Umsetzung nach XProfan.
      Gruss

      Quellcode

      1. Windowtitle "Flattermann":Windowstyle 24:Window %maxx,%maxy:UsePen 1,5,0
      2. 'Q: mathworld.wolfram.com/BatmanCurve.html; 2015-05 nach XProfan by P. Specht
      3. Declare x!,y!,w!,l!,h!,r!,xh&,yh&,m!:xh&=%maxx\2:yh&=%maxy\2:m!=20:Label:
      4. whileloop -700,700,1:x!=&loop/100:w! = 3*sqroot(1-sqr(x!/7))
      5. l!=1/2*(x!+3)-3/7*sqrt(10)*sqroot(4-sqr(x!+1))+6/7*sqrt(10)
      6. r!=1/2*(3-x!)-3/7*sqrt(10)*sqroot(4-sqr(x!-1))+6/7*sqrt(10)
      7. h!=8.3-3/2*w!*(abs(x!+2/3)+abs(x!-2/3))+0.8*(abs(x!+1/3)+abs(x!-1/3))
      8. line xh&+m!*x!,(yh&-m!*Fe(x!)) - xh&+m!*x!,yh&-m!*Fe(x!)-1
      9. line xh&+m!*x!,(yh&-m!*Ge(x!)) - xh&+m!*x!,yh&-m!*Ge(x!)+1
      10. endwhile:m!=m!+4:goto "Label"
      11. Proc sqroot :parameters z!:return if(z!<=0,0,sqrt(z!))
      12. endproc
      13. Proc Fe :parameters x!:return \
      14. (h!-l!)*He(x!+1) + (r!-h!)*He(x!-1) + (l!-w!)*He(x!+3) + (w!-r!)*He(x!-3) + w!
      15. Endproc : Proc He :parameters x!:return x!>0 : Endproc
      16. Proc Ge :parameters x!:return 1/2*(abs(x!/2)+sqroot(1-sqr(abs(abs(x!)-2)-1))- \
      17. 1/112 *(3*sqrt(33)-7)*sqr(x!)+3*sqroot(1-sqr(1/7*x!))-3)* \
      18. (if(x!=-4,0,(x!+4)/abs(x!+4))-if(x!=4,0,(x!-4)/abs(x!-4)))-3*sqroot(1-sqr(1/7*x!))
      19. Endproc
      Alles anzeigen
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Na das sind ja schöne Aussichten ... Ob ein Vorhängeschloss für den Kühlschrank hilft?

      Abt. Mysterien von XProfan
      =================
      Folgendes XProfan11.2a-Programm druckt stets den im Programmablauf zeitlich letzten zugewiesenen Wert. - Aber warum, zum Teufel?
      Gruss

      Quellcode

      1. cls
      2. declare s![5]
      3. print aufruf(s![]) '<< kein index!
      4. waitinput
      5. end
      6. proc aufruf :parameters s![]
      7. s![4]=4
      8. s![3]=3 '<< kein return!
      9. endproc


      Klappt sogar ohne Parameter:

      Quellcode

      1. declare k!, z&
      2. print aufruf()
      3. waitinput
      4. proc aufruf
      5. k!=4
      6. z&=55
      7. endproc
      Endgültig verwirrt dann, daß falsche Stringzuweisungen (ohne Anführungszeichen) richtig ausgegeben werden, richtige aber falsch:

      Quellcode

      1. print wrong()
      2. print wrong2()
      3. waitinput
      4. proc wrong
      5. var k$=1234589.12
      6. endproc
      7. proc wrong2
      8. var k$="1234589.12"
      9. endproc
      Alles anzeigen
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von p. specht ()

    • Man kanns auch noch anders machen:

      Quellcode

      1. cls
      2. declare s![5]
      3. print aufruf(s![]) '<< kein index!
      4. waitinput
      5. end
      6. proc aufruf :parameters s![]
      7. s![4]=4
      8. s![3]=3 '<< kein return!
      9. Var a! = 5 * 9
      10. WhileLoop 33
      11. EndWhile
      12. endproc
      Alles anzeigen
      Ohne Return wird wohl immer die letzte Zuweisung als Rückgabe erkannt. Der Typ spielt dann keine Rolle, der ist immer numerisch. Damit geht dann die Stringzuweisung nicht, aber ohne Anführungszeichen wurde ja ein numerischer Wert zugewiesen. Ist schon interessant, was da so alles passieren kann.

      Gruß Volkmar
    • Jetzt wird's skurril:

      Quellcode

      1. print getlast():waitinput
      2. proc getlast :case 1234.56:
      3. endproc
      Das funktioniert im Interpreter und im Compiler.

      Es geht aber noch wilder: Im Interpreter wird hier die Quelltext-Zeilennummer des ENDPROC Befehls ausgegeben (Compiler zeigt Leerfeld):

      Quellcode

      1. ' Zeilennummer des ENDPROC-Befehls ausgeben
      2. proc getlast :tab(20)
      3. endproc
      4. print getlast() :waitinput
      Genauere Überlegung: Es wird die Rücksprungzeile des Fehlerhaften Proc ausgegeben, denn tab() ohne Print vorher dürfte es ja eigentlich nicht geben. Allerdings ist dann die Frage, wieso der tab()-Befehl trotzdem noch ausgeführt wird ... Saniert das Print im Hauptprogramm die Situation?
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von p. specht ()

    • Tab setzt einfach die Schreibmarke auf die entsprechende Spalte. Geht also auch ohne Print. Profan handhabt das also etwas anders als Basic, wo das Tab Bestandteil einer Print-Anweisung ist. Das geht auch problemlos. Wenn ich das Semikolon in (2) wegnehme, dann wird (4) einfach eingerückt geschrieben.

      Quellcode

      1. cls
      2. Print "Vor dem Tab";
      3. tab(19)
      4. Print "Nach dem Tab"
      5. WaitInput
      Gruß Volkmar
    • Abt. Teile und herrsche
      ===============
      "Zweiteilung" (Bi-Section) heißt einer der ältesten Algorithmen zur Bestimmung einer Nullstelle von kontinuierlichen Funktionen bzw. Formeln. Wenn Newton-Raphson, Steffenson oder andere Hitec-Teile versagen, bestehen mit dem Bisection-Verfahren immer noch gute Chancen, den blöden Nulldurchgang zu finden. Andererseits eignet sich der Algo nicht gut, um bloße Nulllinien-Berührungspunkte zu finden: Die Funktion braucht nämlich Vorzeichenwechsel. Von Speed reden wir besser auch nicht...
      Gruss

      P.S.: Warum Nulldurchgänge überhaupt wichtig sind? Naja, löse z.B. die Gleichung x^2+exp(x)=100: Computer machen daraus x^2+exp(x) - 100 = 0 und suchen die verdammte Nullstelle: Voila, gelöst!

      Brainfuck-Quellcode

      1. Windowtitle "Bisection-Algorithmus"
      2. 'Q: Fortran-IV Source aus 1962, nach XProfan portiert 2015-05 by PS
      3. Cls:Font 2:randomize:AppendMenubar 200,\
      4. "Eingabeln einer Nullstelle per Unterschiedliche_Vorzeichen-Regel"
      5. Proc Fn :Parameters fn&,x!:Declare y!
      6. Select fn&
      7. caseof 0: y!=sqr(x!)+exp(x!)-2
      8. caseof 1: y!=cos(x!)
      9. caseof 2: y!=3-sin(x!)
      10. caseof 3: y!=40-exp(x!)
      11. caseof 4: y!=10
      12. Otherwise : y!=rnd(1000)
      13. Endselect :Return y!
      14. endproc
      15. Proc ShowFn :Parameters fn& :declare y$
      16. Select fn&
      17. caseof 0: y$="y=sqr(x)+exp(x)-2"
      18. caseof 1: y$="y=cos(x)"
      19. caseof 2: y$="y=3-sin(x)"
      20. caseof 3: y$="y=40-exp(x)"
      21. caseof 4: y$="y=10"
      22. Otherwise : y$="y=Undefined "
      23. Endselect :return y$
      24. endproc
      25. Proc Bisect
      26. ' Den Vorzeichenwechsel eingabeln
      27. Parameters fn&,xl!,xr!,epsx!,epsy!
      28. Declare yl!,ym!,yr!,xm!
      29. yl!=Fn(fn&,xl!)
      30. Repeat
      31. xm!=(xl!+xr!)*0.5
      32. ym!=Fn(fn&,xm!)
      33. case (abs(ym!)-epsy!)<=0:BREAK
      34. if (yl!*ym!)<0: xr!=xm!
      35. elseif (yl!*ym!)=0:BREAK
      36. else : xl!=xm!
      37. endif
      38. Until 0
      39. Return xm!
      40. endproc
      41. '---------------------------------------------------------------
      42. 'Hauptprogramm
      43. declare fn&,x1!,y1!,x2!,y2!,epsx!,epsy!,fakt!
      44. '---------------------------------------------------------------
      45. ' Erfolgs- und performanzkritische Parameter!:
      46. fn&=0 '... Testfunktionsnummer
      47. epsx!=val("1e-16")
      48. epsy!=val("1e-16")'...Suchgenauigkeit
      49. x1!=0 : x2!=0.1 '... Startintervall
      50. fakt!= -1.2 '... klappt um und vergrößert Suchbereich
      51. '---------------------------------------------------------------
      52. 'Eingabeln:
      53. y1!=Fn(fn&,x1!)
      54. H1:
      55. y2!=Fn(fn&,x2!)
      56. case (y1!*y2!)<0:goto "H4"
      57. case (y1!*y2!)=0:goto "H5"
      58. '>0:' gleiche Vorzeichen ==> Bereich erweitern durch ...
      59. H2:
      60. x2!=x2!*fakt! 'Vergrößerung und Spiegelung an 0-Punkt
      61. case abs(x2!)<val("1.1e35"):goto "H1"
      62. H3:
      63. Print " Sorry, keine Nullstelle gefunden!":goto "H6"
      64. H4:
      65. x2!=Bisect(fn&,x1!,x2!,epsx!,epsy!)
      66. Print "\n Nullstelle der Funktion ";upper$(ShowFn(Fn&));"\n"
      67. Print " gefunden bei x = ";format$("%g",x2!);"\n"
      68. Print " Nullprobe: y = ";format$("%g",Fn(fn&,x2!));"\n"
      69. Print " ----------------------------------------------------------"
      70. H6:
      71. waitinput
      72. END
      Alles anzeigen
      PPS: Brainfuck ist eine interessante Sprache. Das da oben ist aber XProfan 11!
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von p. specht ()

    • Abt. Altgriechische Zahlwortvorsätze
      =======================
      ... sind beliebt in Wissenschaft, Kunst und Technik. Doch so mancher (also ich zumindest) rätselt, was z.B. ein Heptogramm ist. Aber ab sofort nicht mehr!
      Gruss

      Quellcode

      1. 1 [prôtos] Einzig : Protokoll, Proton, Prototyp, Protein
      2. 1 [haplos] Einzel-: Haploide Teilung
      3. 1 [mono-] Ein- : Monochrom, Monogamie, Monogramm, Monotheismus
      4. 1 [heîs, mía, hen] Einzige
      5. 2 [deúteros]Zwischen-: Deutung, Deuteronum
      6. 2 [dís] Zwie- : Disput
      7. 2 [diplóos] Zwiefältig: Diploide Teikung
      8. 2 [deuteros]Zweifach: Deuterium, Deuteron,
      9. 2 [Di-] Zwei : Diode, Distickstoffmonoxid
      10. 2 [Duos] Zweier: Dual, Duo
      11. 3 [treîs][tría][trítos][trís],
      12. 3 [tri-][tria-] Drei- : Triptychon, Triangel, Trichlormethan, Trilogie, Trillion, Trigonometrie
      13. 4 [téttara] Vierer : Tesserakt
      14. 4 [tetra-] Vier- : Tetraeder, Tetrapack, Tetrachlorkohlenstoff
      15. 5 [pént-] Fünfter : Pentium
      16. 5 [penta-] Fünf : Pentachlorphenol, Pentagon, Pentagramm, Pentameter, Pentan
      17. 6 [hex][héktos][hexa-] : Hexadezimal, Hexaeder, Hexagon, Hexagramm, Hexameter, Hexan
      18. 7 [heptá],[hepta-]: Heptagramm, Heptan, franz.: hebdomadaire = wöchentlich (7 Tage)
      19. 8 [okto][ógdoos][oktákis][okta-]: Oktaeder, Oktan, Oktogon, Oktopus, Oktopode
      20. 9 [ennéa][énatos][ennea-]: Enneagramm, Ennealogie, Enneacanthus
      21. 10 [déka][deka-]: Dekagramm, Dekade, Dekalog, Dekan, Dekameron
      22. 11 [hendeka-]: Hendekasyllabus, Hendekan
      23. 12 [dodeka-]: Dodekaeder, Dodekanes, Dodekaphonie
      24. 13 [triskaideka-]: Triskaidekaphobie
      25. 14 [tetrakaideka-]: Tetradekasilan
      26. 15 [pentakaideka-]: Pentadekan
      27. 16 [hektakaideka-][Hexa-]: Hexadezimalsystem
      28. 17 [heptakaideka-]
      29. 18 [oktokaideka-]
      30. 19 [enneakaideka-]
      31. 20 [eikosa-]: Ikosaeder
      32. 30 [triakostós][triakontákis][triakonta-]: Triakontan, Rhombentriakontaeder
      33. 40 [tettarakonta-]
      34. 50 [pentekonta-]: Pentekontaetie, Pfingsten (griech."der fünfzigste Tag")
      35. 60 [hexekonta-]
      36. 70 [hebdomekonta-]
      37. 80 [ogdoekonta-]
      38. 90 [enenekonta-]
      39. 100 [hekatón][hekaton(to)-]: Hekatombe, Hektar, Hektoliter, Hektographieren
      40. 200 [diakosa-]
      41. 300 [triakosa-]
      42. 400 [tetrakosa-]
      43. 500 [pentakosa-]
      44. 600 [hexakosa-]
      45. 700 [heptakosa-]
      46. 800 [oktakosa-]
      47. 900 [enakosa-]
      48. 1000 [chilio-]: Chiliasmus, Chiliarch, Kilo, Kilometer
      49. 2000 [dischilio-]
      50. ...usw.
      51. 10.000 [myrio-]: Myriade, Myriapoda
      52. 20.000 [dismyrio-]
      53. ... usw.
      Alles anzeigen
      P.S.: Das Ganze gibts auch auf Lateinisch:

      Quellcode

      1. uniformis – einförmig
      2. duplicarius – Doppelsöldner
      3. trivium – Dreiweg, Weggabelung (allgemein bekannte Stelle, vergleiche „trivial“)
      4. quadrātus – viereckig, vergleiche „Quadrat“
      5. quīnquennium – Jahrfünft
      6. sextārius – ein „Schoppen“ von 1/6 congius, etwa 1/2 Liter (54 cl)
      7. september – der 7. Monat (vor 153 v. Chr.), entsprechend october, november, december
      8. octipēs – achtfüßig
      9. nōnāria – antikes Straßenmädchen (die durften erst ab der 9. Stunde dem Gewerbe nachgehen, daher der Name)
      10. decennis – zehnjährig
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von p. specht ()

    • Abt. Sqrt(2)^Sqrt(2) ?
      ===============
      Geg.: Quadratwurzel_aus_2$ = "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636005" ' (2001 dec.-digits)

      Ges.: Sqrt(2)^Sqrt(2) (Wurzel 2 hoch Wurzel 2, Ergebnis muß irgendwo zwischen
      1.6325269194381528447734953810247 (Windows-Taschenrechner, zu nieder) und
      1.6696086816425961231807451562932 (Bignum-Library, zu hoch?) liegen.

      Gruss

      P.S.: So sieht echter "Brainfuck" aus, Leute!

      PPS: Quadratwurzel(2) ist in XProfan auf 15 Kommastellen genau, siehe Progi:

      Quellcode

      1. cls
      2. set("decimals",18)
      3. print "1.4142135623730950488016887242096980785696718753769480"
      4. print sqrt(2)
      5. waitinput
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Abt. Kettenbruchentwicklung
      ==================
      Anbei einige Procs, die Kettenbruchformeln bekannter mathematischer Konstanten auf XProfans DoublePrecision-Genauigkeit ausgeben. Kettenbrüche nähern irrationale Zahlen im Prinzip auf beliebige Genauigkeit an - nur deswegen sind sie als Verfahren heute überhaupt noch von Interesse. In frühen Programmiersprachen dienten Kettenbruchentwicklungen zur Emulation noch nicht implementierter höherer Funktionen wie Wurzel_aus oder y=Exp(x) durch alleinige Berechnung mit Ganzzahlwerten in Addition, Multiplikation und Inversion. Moderne Sprachen haben das heutzutage alles schon fix eingebaut.
      Gruss

      P.S.: Für Pi gab es auch damals schon weitaus schnellere Verfahren.

      Quellcode

      1. CLS
      2. set("decimals",17)
      3. proc KettPi 'Kettenbruchentwicklung von Pi
      4. var n&=131000 'Iterationen für Profan-Genauigkeit
      5. declare z!,n!,c!
      6. whileloop n&,0,-1
      7. z!=sqr(2*&Loop+1)
      8. n!=6+c!
      9. c!=z!/n!
      10. endwhile
      11. return 3+c!
      12. endproc
      13. proc Exp_1
      14. 'Kettenbruchentwicklung der Basis des Natürl. Logarithmus
      15. declare n!,n&
      16. n&=17 'Profan-Genauigkeit
      17. whileloop n&,2,-1
      18. n!=&Loop/(&Loop+n!)
      19. endwhile
      20. return 2+n!
      21. endproc
      22. proc KettSqrt2 'Kettenbruchentwicklung der Quadratwurzel aus 2
      23. 'vgl. http://apod.nasa.gov/htmltest/gifcity/sqrt2.1mil
      24. var n&=20 'Iterationen für Profan-Genauigkeit
      25. declare z!,n!,c!
      26. whileloop n&,0,-1
      27. z!=1
      28. n!=2+c!
      29. c!=z!/n!
      30. endwhile
      31. return 1+c!
      32. endproc
      33. proc GoSchnitt 'Kettenbruchentwicklung des Goldenen Schnittes (sqrt(5)+1)/2
      34. '1.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475
      35. var n&=37 'Iterationen für Profan-Genauigkeit
      36. declare z!,n!,c!
      37. whileloop n&,0,-1
      38. z!=1
      39. n!=1+c!
      40. c!=z!/n!
      41. endwhile
      42. return 1+c!
      43. endproc
      44. ' Hauptteil
      45. Print
      46. Print " Exp(1) genau = 2.71828182845904523536028747135266249775724709369995"
      47. Print " Exp1() = ";Exp_1()
      48. Print " XProf-exp(1) = ";exp(1)
      49. Print
      50. print " Genau_Sqrt(2)= 1.414213562373095048801688724209698078569671875376948073"
      51. print " KettSqrt2 = ";KettSqrt2()
      52. print " XProf-Sqrt(2)= ";sqrt(2)
      53. print
      54. print " Gold.Schnitt = 1.6180339887498948482045868343656381177203091798057628621"
      55. print " GoSchnitt() = ";GoSchnitt()
      56. print " (sqrt(5)+1)/2= ";(sqrt(5)+1)/2
      57. print
      58. print " Genaues Pi() = 3.141592653589793238462643383279502884197169399375"
      59. print " XProfan-Pi() = ";Pi()
      60. print " KettPi()-Berechnung läuft..."
      61. print " KettPi() = ";KettPi()
      62. print
      63. print "====================================================="
      64. beep
      65. waitinput
      66. END
      Alles anzeigen
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von p. specht ()

    • Nachtrag zum Thema Kettenbrüche: Zahnrad-Problem von Huygens
      (Q: Internet)
      Spoiler anzeigen

      Der niederländische Astronom Christiaan Huygens stieß 1680 bei der Planung eines mechanischen Modells des Sonnensystems auf ein Problem, das heute das Paradebeispiel für die ganzzahlige Approximation von Verhältnisgrößen mit Hilfe von Kettenbrüchen gilt. Er mußte die Zahnanzahl von zwei Zahnrädern bestimmen, die dem Verhältnis der Winkelgeschwindigkeiten zweier Planeten bei ihrem Umlauf um die Sonne entsprechen. Dieses Verhältnis war durch eine Messung als 77708431 / 2640858 bestimmt worden. Zahnräder mit derart vielen Zähnen lassen sich jedoch mechanisch nicht konstruieren, weshalb er vor die Aufgabe gestellt war, dieses Verhältnis möglichst gut anzunähern.


      Eine naive Näherung wäre zum Beispiel 77700000 / 2600000 = 777 / 26. Die Anzahl der Zähne ist allerdings immer noch zu groß, und der relative Fehler ist mit 1.6% zu hoch. Die Lösung sollte also einen möglichst kleinen Nenner haben.


      Christiaan Huygens löste das mit Hilfe von Näherungs-Kettenbrüchen. Bereits der dritte Näherungsbruch lieferte mit einem Umsetzungsverhältnis von 206 zu 7 eine befriedigende Lösung: Die Anzahl der Zähne ist ~viermal so klein wie bei der naiven Schätzung 777/26 und der relative Fehler beträgt mit ~0.01% lediglich etwa 1/160stel des Fehlers bei der naiven Variante. Und Zahnräder mit 206 Zähnen waren durchaus herstellbar.
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3
    • Abt. x^x (x hoch x)
      =============
      Was ist in Eurer XProfan-Version der höchste Wert von x, bei dem x hoch x gerade noch nicht zu einem Overflow führt? Die einzelnen Profanversionen scheinen da sehr unterschiedlich zu sein. Für XProfan 11.2a lauten die Werte x=143.016087935746839 mit x^x=1.7976931348618e308, rausgekriegt mit nachstehendem Progi, dass das vorletzte x in die Zwischenablage schreibt.
      Gruss

      P.S.: In den anderen Versionen ist der Wert in der Regel deutlich kleiner, der Windows-Taschenrechner kann das aber sogar bis knapp über 2889^2889.

      Quellcode

      1. cls
      2. set("decimals",18)
      3. var r!=143.016087935746839 :' r!^r!=1.7976931348618e308
      4. repeat
      5. clearclip:putclip format$("%g",r!^r!)
      6. r!=r!+0.0000000000001
      7. print r!,format$("%g",r!^r!)
      8. until 0
      9. waitinput
      PPS.: Warum ich frage? y=x^x ist (bei vorgegebenem y) die sog. Sophomore-Funktion. Man kann sie nicht geschlossen algebraisch lösen, sondern muss sich iterativ nähern, etwa mit Newton-Raphson. Für größere Werte klappt aber nurmehr das Eingrenzen von unten her, von oben droht der Overflow. Also muss eine Versionsabfrage diesen Fehler abfangen...
      Spoiler anzeigen

      'Wen's interessiert: Das sind die ersten Ableitungen von y=x^x nach dx:

      y!=x!^x!
      y1!=x!^x!*(Ln(x!)+1)
      y2!=x!^x!*(Ln(x!)+1)^2+x!^(x!-1)
      y3!=x!^(x!-2)*(x!^2*(Ln(x!^3)+Ln(x!)^3+3*Ln(x!)^2+1)+x!*(Ln(x!^3)+3)-1)

      y4!=x!^(x!-3)*(x!^2*(Ln(x!^12)+6*Ln(x!)^2+6)+x!^3*(Ln(x!^4)+\
      Ln(x!)^4+4*Ln(x!)^3+6*Ln(x!)^2+1)+x!*(-Ln(x!^4)-1)+2)

      y5!=x!^(x!-4)*(x!^3*(Ln(x!^30)+10*Ln(x!)^3+30*Ln(x!)^2+10)+x!*Ln(x!^10)+\
      x!^4*(Ln(x!^5)+Ln(x!)^5+5*Ln(x!)^4+10*Ln(x!)^3+10*Ln(x!)^2+1)+\
      x!^2*(-Ln(x!^5)-10*Ln(x!)^2+5)-6)

      y6!=(x!^(x+5)*Ln(x!)^6+6*x!^(x!+5)*Ln(x!)^5+x!^x!*(15*x!^5+15*x!^4)*Ln(x!)^4+\
      x!^x!*(20*x!^5+60*x!^4-20*x!^3)*Ln(x!)^3+x!^x!*(15*x!^5+90*x!^4-15*x!^3+\
      30*x!^2)*Ln(x!)^2+x!^x!*(6*x!^5+60*x!^4+30*x!^3-36*x!)*Ln(x!)+\
      x!^x!*(x!^5+15*x!^4+25*x!^3-15*x!^2+4*x!+24))/(x!^5)
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von p. specht ()

    • Abt. Sophomore-Funktion x^x = C
      ======================
      Der Algorithmus "Lineares Bereichssplitting" wird etwas langsam, wenn der Bildbereich (C hier zwischen 1 und 1.7976931348618*10^308) groß ist und daher je nach Wertekonstellation u.U. viele Halbierungsschritte des Intervalls nötig werden. Für das Verfahren spricht dagegen seine Einfachheit, und daß man sich dadurch den Weg über die komplexe Lambert-W-Funktion ersparen kann, die ja auch nicht gerade für Highspeed-Realisierungen bekannt ist.
      Gruss

      Quellcode

      1. Windowtitle "Die Sophomore-Funktion x^x = C im Bereich C>=1 lösen"
      2. '(CL) CopyLeft 2015-05 by P.Specht, Wien. Ohne jegliche Gewähr!
      3. ' C! = 1 ... 143.016087935746839 ^ 143.016087935746839
      4. ' Methode: Digitales Splitting, nutzt NICHT die Lambert-W-Funktion!
      5. WindowStyle 24:Declare y$,y!,w!,s!
      6. var eps!=10^-17:set("decimals",17)
      7. rept:
      8. Cls:print "\n x^x [1.0 ... 1.7976931348618E308] = ";:input y$
      9. Case (y$=""):y$="1.7976931348618E+308"
      10. y!=val(y$)
      11. if (y!<1) or (y!>1.7976931348618E308)
      12. print " ***Out of range!*** ":goto "rept"
      13. endif
      14. w!=143.016087935746839/2 ' Aktueller Vergleichsvektor
      15. s!=w! ' Schrittweite
      16. Repeat
      17. 'print tab(5);format$("%g",w!);tab(45);" Err = ";format$("%g",s!)
      18. s!=s!/2
      19. if (w!^w!)>=y!
      20. w!=w!-s!
      21. else
      22. w!=w!+s!
      23. endif
      24. until s!<eps!
      25. print "\n Epsilon = ";format$("%g",eps!)
      26. print "\n LastStep= ";format$("%g",s!)
      27. print "\n Zielwert = ";format$("%g",y!)
      28. print "\n X ^ X = ";format$("%g",w!^w!)
      29. font 2
      30. print "\n Ergebnis = ";format$("%g",w!);" ... in Zwischenablage kopiert."
      31. clearclip:putclip translate$(format$("%g",w!),".",",")
      32. print "\n AbsErr = ";format$("%g",w!^w!-y!)
      33. font 0
      34. beep
      35. Waitinput 7000
      36. Waitinput 15000
      37. goto "rept":End
      Alles anzeigen
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von p. specht ()

    • Abt. Doch kein Urknall?
      ==============
      Neue, sehr unkonventionelle Theorien lassen Modelle des Universums zu, die ohne Urknall auskommen. So wird argumentiert, daß die Rotverschiebung des Spektrums entfernter Galaxien doch nicht - bzw. nicht allein - auf den Dopplereffekt zurückgeführt werden muss (als Expansion des Universums interpretiert), sondern die nachweisbare 'Dunkle Materie' ausreichen könnte, um eine "Lichtalterung" = Energieverlust = Rotverschiebung (ähnlich der Frequenzverschiebung beim Entkommen von Licht aus starken Gravitationsfeldern) auszulösen. Weiters sei die 'Dunkle Materie' möglicherweise nichts anderes als Materie überlichtschneller Paralleluniversen, die daher nicht unmittelbar interagiert und deshalb unsichtbar ist. In diesem Fall wird davon ausgegangen, daß alle Dimensionen in sich gekrümmt sind - einschließlich der Zeitachse!

      Also bitte nicht wundern, wenn ihr Euch auf der Autobahn plötzlich selbst überholt... Es wird sich ja hoffentlich durch neue Experimente klären lassen, ob das Universum nun tasächlich etwa 119.916.417.600.000.000 Sekunden alt ist oder vielleicht doch bereits viel länger existiert.
      Gruss
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von p. specht ()

    • Abt. Linksdrehend
      ===========
      In der belebten Natur kommen praktisch nur linksdrehende Aminosäuren vor (Doppelhelix, organische Enzyme etc.): Linksdrehende Eiweisse haben sich offenbar gegenüber rechtsdrehenden durchgesetzt! Biochemiker und Pharmakologen rauften sich früher z.B. oft die Haare, weil die Analyse des erzeugten Medikamentenwirkstoffes zeigte, daß die Herstellungsformel genau eingehalten wurde, aber das Zeug dennoch nicht gewirkt hat. Dann war es wieder mal passiert, daß die rechtsdrehende Eiweiss-Variante entstand, die biologisch völlig unwirksam bleibt.

      Die anfängliche Chance, daß links- oder rechtsdrehendes Zeug entsteht, ist 50:50 (zumindest wenn die Ausgangssuppe nicht 'vorgeimpft' wurde). Aber wieso? (Ein ähnliches Problem wirft die Frage auf, warum es im bekannten Universum vor allem Materie und kaum Antimaterie gibt, wo doch die Ausgangslage sicher symmetrisch war?). Die Antwort lautet "Symmetriebruch" - Aber das beschreibt wohl eher das Ergebnis, als das es beim Verständnis hilft. Daher das folgende Progi, inspiriert von einem Kapitel aus "Zahl, Zeit, Zufall" von Prof. Rudolf Taschner.

      Quellcode

      1. WindowTitle "Warum in der Natur linksdrehende Aminosäuren dominieren"
      2. WindowStyle 24:randomize:window 0,0-%maxx,%maxy
      3. print
      4. print " Ausgangspunkt ist ein verdeckter Korb mit gleich vielen weissen wie"
      5. print " schwarzen Kugeln darin. Waisenmädchen Anni Zufall zieht die Hälfte "
      6. print " der Kugeln aus den Korb. Danach dürfen sich die verbliebenen Kugeln "
      7. print " sozusagen vermehren (die Zahl der weissen, die Zahl der schwarzen "
      8. print " Kugeln wird verdoppelt), sodaß die Ausgangsmenge im Korb wieder "
      9. print " hergestellt ist. Nun wird Anni wieder reingerufen und zieht neuerlich"
      10. print " ... solange bis entweder nurmehr schwarze oder nur mehr weisse Kugeln"
      11. print " im Korb sind. Dann ist das Spiel zugunsten einer Variante entschieden."
      12. print
      13. print " [Taste]"
      14. waitinput
      15. declare w&,s&,z&
      16. Nochmal:
      17. cls
      18. font 2
      19. print "\n Wieviele weisse Kugeln sind im Ausgangskorb?: ";
      20. input w&
      21. print "\n Wieviele schwarze? [Leer = gleich viele]: ";
      22. input s&
      23. case s&=0:s&=w&
      24. z&=s&+w&
      25. repeat
      26. Zeig
      27. waitinput 333
      28. whileloop (w&+s&)/2
      29. if rnd()<0.5
      30. w&=w&-1
      31. else
      32. s&=s&-1
      33. endif
      34. endwhile
      35. w&=w&*2
      36. s&=s&*2
      37. case w&<0: break
      38. case s&<0: break
      39. while (w&+s&)>z&
      40. case w&>0:w&=w&-1
      41. case s&>0:s&=s&-1
      42. endwhile
      43. until %key=27
      44. Zeig
      45. Print "\n\n ... = Endergebnis!"
      46. beep:waitinput :waitinput
      47. goto "Nochmal"
      48. proc Zeig
      49. locate 10,1:print space$(w&+s&);:locate 10,1
      50. print mkstr$("O",w&);mkstr$("#",s&);
      51. endproc
      52. End
      Alles anzeigen
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • ...oder genau umgekehrt?
      ================
      Nachtrag zu oben: Weiteres Literaturstudium zeigt uneinheitliche Bezeichnungen: Im deutschsprachigen Raum findet man die Bezeichnung "L-Aminosäure" und "R-Aminosäure". Dabei scheint die "technische Schraubrichtung" des Moleküls entlang seiner Hauptachse gemeint zu sein.
      In der anglophilen Fachliteratur kennt man dagegen die Bezeichnungsvorsätze "L-" für rechtsdrehend (!) und "D-" für linksdrehend, wobei aber die Wirkung auf die Polarisationsebene polarisierten Lichtes gemeint ist. Dabei sind die "rechtsdrehenden" L-Moleküle die biologisch wirksamen! Verwirrend ausgedrückt - Sorry!
      Spoiler anzeigen
      Windowtitle "Drum prüfe, wer sich ewig schindet, ob sich kein bess'rer Algo findet!"
      set("decimals",18):cls:font 2
      print " Rundungsdifferenz: ";sqrt(2)-exp(1/2*ln(2))
      print " Gleichheitstest: ";sqrt(2)=exp(1/2*ln(2))
      Print "\n Knapp vorbei ist auch daneben ..."
      Waitinput
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Abt. Gute Näherung für die Gauss'sche Fehlerfunktion Erf(x)
      ======================================
      ...mit möglichst wenig Änderungen an der Basic-Vorlage von Prof. J_P_Moreau, und natürlich mit einem Goto-Befehl. Funktioniert gut, dennoch ohne jede Gewähr!
      Gruss

      P.S.: Wird u.a. in der sog. Wärmeleitungsgleichung gebraucht. Wer dagegen ErfC() braucht, kann sich y1! atatt y! vom Proc zurückgeben lassen.

      Brainfuck-Quellcode

      1. 'Q: http://jean-pierre.moreau.pagesperso-orange.fr/Basic/asymerf_bas.txt
      2. 'Transscribed to XProfan 11.2a (Demo only!) 2015-06 by P. Specht, Vienna (Austria)
      3. '****************************************************
      4. '* Program to demonstrate ASYMERF *
      5. '* ------------------------------------------------ *
      6. '* Reference: BASIC Scientific Subroutines, Vol. II *
      7. '* by F.R. Ruckdeschel, BYTE/McGRAWW-HILL, 1981 [1].*
      8. '* ------------------------------------------------ *
      9. '* SAMPLE RUN: *
      10. '* *
      11. '* Find the value of ERF(X)=2*Exp(-X*X)/SQRT(PI) *
      12. '* *
      13. '* Input X ? 3 *
      14. '* ERF(X)= .9999779 with error estimate= -.00000000 *
      15. '* Number of terms evaluated was 10 *
      16. '* *
      17. '* Input X ? 4 *
      18. '* ERF(X)= 1.0000000 with error estimate= 0.0000000 *
      19. '* Number of terms evaluated was 17 *
      20. '* *
      21. '****************************************************
      22. 'DEFINT I-N
      23. 'DEFDBL A-H, O-Z
      24. declare x!,y!,e!,n&
      25. rept:
      26. CLS
      27. PRINT "\n Input X: ";:INPUT x!
      28. y!=S1000(x!)
      29. PRINT
      30. PRINT format$(" ERF(X)= %g ",y!),
      31. print format$(" with error estimate= %g",e!)
      32. PRINT
      33. PRINT " Number of terms evaluated was ";n&
      34. PRINT
      35. waitinput
      36. goto "rept"
      37. END
      38. '***********************************************************
      39. '* Asymptotic series expansion of the integral of *
      40. '* 2 EXP(-X*X)/(X*SQRT(PI)), the normalized error function *
      41. '* (ASYMERF). This program determines the values of the *
      42. '* above integrand using an asymptotic series which is *
      43. '* evaluated to the level of maximum accuracy. *
      44. '* The integral is from 0 to X. The input parameter, X *
      45. '* must be > 0. The results are returned in Y and Y1, *
      46. '* with the error measure in E. The number of terms used *
      47. '* is returned in N. The error is roughly equal to first *
      48. '* term neglected in the series summation. *
      49. '* ------------------------------------------------------- *
      50. '* Reference: A short table of integrals by B.O. Peirce, *
      51. '* Ginn and Company, 1957. *
      52. '***********************************************************
      53. proc S1000 :parameters x!
      54. declare y!,c2!,c1!,y1!
      55. 'uses external n&,e!
      56. n& = 1:y! = 1
      57. c2! = 1 / (2 * x! * x!)
      58. GG1100:
      59. y! = y! - c2!
      60. n& = n& + 2: c1! = c2!
      61. c2! = -c1! * n& / (2 * x! * x!)
      62. 'Test for divergence - The break point is roughly N=X*X
      63. case ABS(c2!) > ABS(c1!): GOTO "GG1200"
      64. 'Continue summation
      65. GOTO "GG1100"
      66. GG1200:
      67. n& = (n& + 1) / 2
      68. e! = EXP(-x! * x!) / (x! * 1.772453850905516)
      69. y1! = y! * e!
      70. y! = 1 - y1!
      71. e! = e! * c2!
      72. RETURN y!
      73. Endproc
      74. 'End of file Asymerf.prf
      Alles anzeigen
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von p. specht ()

    • Abt. Interessante Links betreffend Datencodes in Matrixform
      =====================================
      Strichcode-Fibel (pdf)
      Wiki Bildverarbeitung (u.a. von Strichcodes und DataMatrix-Codes)
      Wiki 2D-Codes
      Mobile Tagging (2D-Codes für Handy-Kamera-Decodierung)
      ... insb. der verbreitete QR-Code
      DV-Brieffreimachung für Massensendungen
      Produktkennzeichnung durch Nadelprägung (pdf)
      Gruss
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3
    • Abt. Lehrreiche Links
      =============
      Webseite von p.t. Siegfried Petry (u.v.a. mit einer Einführung in die Tensorrechnung)
      Briefe Einsteins an den Astronomen August Kopff zum Verständnis der Relativitätstheorie (pdf)
      Video "Quantenphysik für Dummies"
      Wiki: Liste der Nobelpreisträger für Physik
      Video: Planet in Erdgröße im AlphaCentauri-System aufgefunden
      Video: Absurde Mathematik: Paradoxien wider die mathematische Intuition

      Gruss

      P.S.: Heute früh ist Pierre Brice, der Winnetou unserer Jugend, im Alter von 86 in den Armen seiner Frau verstorben. Er ruhe in Frieden!
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()