kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

3..3.2024
Einen mathematischen Beweis kann ich natürlich
nicht bringen. Ich kann nur feststellen:

Jede rationale Zahl > 1 , gerade oder ungerade ergibt > unendlich , das gilt auch für die Zwei
Jede irrationale Zahl > unendlich
Jede transzendente Zahl > unendlich
Nur die EINS ( cos(pi)=1 ) > endlich , auch bei sehr hohen Zahlen ist
Ich 'glaube' , dass es keinen Gegenbeweis für die Vermutung von COLATZ gibt
Gute Zeit OSWALD

Code: Alles auswählen


from math import    pi, sin,cos 
 
def collatz(n):
    while n > 1:
        print(n, end=' ')
        if (n % 2):
           # n is odd                       (n+1) ergibt immer auch eine ungerade Zahl)
           
              n = 2* n+1                                           #  Ganzzahl            irrational
           # n = cos(pi) * n + 1                                #  cos(p) = 1         ratiomal
           # n = sin(pi) *  n + 1                                #  sin(pi) =            transzendent


            
               
        else:
            # n is even
            n = n//2
    print(1, end='')
 
 
n = int(input('Enter n: '))
print('Sequence: ', end='')
collatz(n)






OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

3.3.2024
Mein Fazit:
Die Collatz-Formel ergibt:
Jede rationale gerade Zahl wird durch (n+1)
zur ungeraden und damit zur irrationalen Zahl.
(Transzendente Terme, die 1 ergeben sind auch Eins, etwa cos(pi)).
Ein indirekter Beweis ???)
Gute Zeit OSWALD
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

4.3.24
Soeben las ich im Spiegel, dass die Vermutung von Collath
von eieem deutschen Mathematiker berweisen wurde.
Gute Zeit OSWALD
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: Der Artikel ist von 2011 und der Beweis war fehlerhaft.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

4.3.24
Ich konnte eben innerhalb von 9 min
mit diesen Zahlen die "1" erreichen

XXXXXXXXXX.py
Enter n: 101010101010101010101010 (24 Stellen)
Auf Wunsch können die Zahl aufgezeigt werden.
PS Warum erschien heute dieser Artikel?.
Habe nur Überschrift flüchtig gelesen.
OSWALD
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: Welcher Artikel ist heute erschienen? Link?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

5.3.24
Hallo __blackjack__ tut mir leid.
Ich weiß nicht wie der Artikel von 2011 auf meinen Bildschirm
kam. Ändert aber nichrs an den Fakten,
Gruß OSWALD
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

6.3.2024
Ich habe den Code an 3 Stellen verändert.
Folge: die Performance vielfach erhöht.
wenige Sekunden für mehr als 30 Stellen
die Endzahl 4 2 1

Fragen : Sequenzen gleich wie beim Original?, also sinnvoll?
Bitte prüfen. Danke
Gute Zeit OSWALD

Code: Alles auswählen



def collatz(n):
    while n > 1:
        print(n)                                #Anderung : print(n)                        eingesetzt    statt  print(1,end = ' ')
        print(n, end=' ')                    #Änderung : print(n,end= ' ')                  "
        if (n % 2):
            # n is odd
            n = 3*n + 1
        else:
            # n is even
            n = n//2
            #pint(n)     
    print(n, end=' ')                           #Änderung:print(n,end= ' ')
 
 
n = int(input('Enter n: '))
print('Sequence: ', end='')
collatz(n)






OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

Diese mehr als 50-stellige Zahl wurde soeben
in weniger als 20 sec von meinen abgeänderten Programmcode
erfolgreich bearbeitet.
Damit bin ich jetzt überzeugt,. dass das Ergebnis
als eine Annäherung an die Richtigkeit Colatz-Vermutung
betrachtet werden kann,.

Enter n: 234567890222333555777995666744563456123456789777555444
Ergebnis wurde mit anderen ähnlich hohen Zahlen nachvollzogen

Gute Zeit OSWALD
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

10.3.2024
Ich habe mich weiter mit dem "Geheimnis" der COLLATZ-Vermutung befasst
und die 3*n+1 durch 3*n +1.00000000000000000000000005 oder noch weniger ersetzt.
Was ist die Folge ?
je mehr Nullen hinter dem Komma, umso später ' merkt das Programm',
dass es sich nicht mehr um Zahlen vom ° Typ int " , sondern um Zahlen vom "Typ float " handelt.
Man kann das alles leicht nachvollziehen, indem man abwechselnd die Prüfziffern und(/oder
die Nullstellen nach Komma ändert.
Frage: sind Folgen mit int-Zahlen als Volgen mit float-Zahlen.
Wenn ja, wäre das ein weiterer Hinweis auf die Collatz-Vermutung?
Gute Unterhaltung OSWALD


Akturlles Beispiel Ergebnis
Enter n: 1236543
Sequence: 1236543 3709630.0 1854815.0 5564446.0 2782223.0 8346670.0 4173335.0 12520006.0 6260003.0 18780010.0 9390005.0 28170016.0 14085008.0 7042504.0 3521252.0 1760626.0 880313.0 2640940.0 1320470.0 660235.0 1980706.0 990353.0 2971060.0 1485530.0 742765.0 2228296.0 1114148.0 557074.0 278537.0 835612.0 417806.0 208903.0 626710.0 313355.0 940066.0 470033.0 1410100.0 705050.0 352525.0 1057576.0 528788.0 264394.0 132197.0 396592.0 198296.0 99148.0 49574.0 24787.0 74362.0 37181.0 111544.0 55772.0 27886.0 13943.0 41830.0 20915.0 62746.0 31373.0 94120.0 47060.0 23530.0 11765.0 35296.0 17648.0 8824.0 4412.0 2206.0 1103.0 3310.0 1655.0 4966.0 2483.0 7450.0 3725.0 11176.0 5588.0 2794.0 1397.0 4192.0 2096.0 1048.0 524.0 262.0 131.0 394.0 197.0 592.0 296.0 148.0 74.0 37.0 112.0 56.0 28.0 14.0 7.0 22.0 11.0 34.0 17.0 52.0 26.0 13.0 40.0 20.0 10.0 5.0 16.0 8.0 4.0 2.0 1

Code: Alles auswählen

def collatz(n):
    while n > 1:
        print(n, end=' ')
        if (n % 2):
            # n is odd
            n = 3 *n + 1.0000000000000000000000000005
            
        else:
            # n is even
            n = n//2
    print(1, end='')
 
 
n = int(input('Enter n: '))
print('Sequence: ', end='')
collatz(n)
 
#     Hier die Endzahlen,
##   nicht mehr als int-Typ sondern als  föoat-Typen
#40.0 20.0 10.0 5.0 16.0 8.0 4.0 2.0 1
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

12.3.2024
Das Thema Collatz-Vermutung war interessant.
Es bleibt nur noch das Fazit:
Das Ergebnis ist immer " 1" mal mit Integer-Zahlen, mal mit float-Werten.
Es genügt der Term "n = 3* n + 1. " ohne weitere Nachkommastellen.
In beiden Versionen bei den vorhandenen Mitteln, keine Störfaktoren erkennbar.
Ich glaube Collatz vermutete richtig.
Gute Zeit OSWALD

Code: Alles auswählen

#                   Wird im  vorliegenden  Programm  in Zeile 12   
#                   die   1 (   int)    durch   1. ( float )  ersetzt, 
#                           dann  wird die Collatz-Folge   
#                                        1.0 beendet.

def collatz(n):

    while n > 1:
                                #Anderung : print(n)                        eingesetzt  
        print(n, end=' ')                    #Änderung : print(n,end= ' ')                  "
        if (n % 2):
            # n is odd
            n = 3*n + 1.
            
        else:
            # n is even
            n = n//2
               
    print(1, end=' ')                           #Änderung:print(n,end= ' ')
 
 
n = int(input('Enter n: '))
print('Sequence: ', end='')
collatz(n)

Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: Mit der Gleitkommazahl kann es passieren, dass es bei grossen Zahlen ungenau wird, das heisst falsche Ergebnisse liefert. Das macht also keinen Sinn da eine Gleitkommazahl einzubauen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

12.3.2024
__blackjack__


Ich bin ganz zufällig auf died Gleitkommazahlen
gekommen und habe dann nach mehrfacher Anwendung gesehen, dass
alle Zahlen immer wwieder die Form XXX.0 hatten, bis zur 1 am Ende der Sequenz.
Warum das so ist, dafür habe ich keine plausible Erklärung gefunden.
Ich weiß nur, dass Python sehr empfindlich auf plötzlichen Typenwechsel reagiert.

Herzlichen Dank für Deine fachliche Zuwendung.
Gute Zeit OSWALD
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

Enter n: 33333
Sequence: 33333 100000.0 50000.0 25000.0 12500.0 6250.0 3125.0 9376.0 4688.0 2344.0 1172.0 586.0 293.0 880.0 440.0 220.0 110.0 55.0 166.0 83.0 250.0 125.0 376.0 188.0 94.0 47.0 142.0 71.0 214.0 107.0 322.0 161.0 484.0 242.0 121.0 364.0 182.0 91.0 274.0 137.0 412.0 206.0 103.0 310.0 155.0 466.0 233.0 700.0 350.0 175.0 526.0 263.0 790.0 395.0 1186.0 593.0 1780.0 890.0 445.0 1336.0 668.0 334.0 167.0 502.0 251.0 754.0 377.0 1132.0 566.0 283.0 850.0 425.0 1276.0 638.0 319.0 958.0 479.0 1438.0 719.0 2158.0 1079.0 3238.0 1619.0 4858.0 2429.0 7288.0 3644.0 1822.0 911.0 2734.0 1367.0 4102.0 2051.0 6154.0 3077.0 9232.0 4616.0 2308.0 1154.0 577.0 1732.0 866.0 433.0 1300.0 650.0 325.0 976.0 488.0 244.0 122.0 61.0 184.0 92.0 46.0 23.0 70.0 35.0 106.0 53.0 160.0 80.0 40.0 20.0 10.0 5.0 16.0 8.0 4.0 2.0 1
wie dieses Ergebnis
OSWALD
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

20.3.2024
Immer wieder mal darf es hier auch Spass machen
OSWALD

Code: Alles auswählen

 # importing Tkinter and math 
from tkinter import *
import math
from math import *

class calc:
    def getandreplace(self): 

      
        self.expression = self.e.get() 
        self.newtext=self.expression.replace('/','/') 
        self.newtext=self.newtext.replace('x','*') 


    def equals(self): 
        """when the equal button is pressed"""
        self.getandreplace() 
        try: 
            # evaluate the expression using the eval function 
            self.value= eval(self.newtext) 
        except SyntaxError or NameError: 
            self.e.delete(0,END) 
            self.e.insert(0,'Invalid Input!') 
        else: 
            self.e.delete(0,END) 
            self.e.insert(0,self.value) 

    def squareroot(self): 
        """squareroot method"""
        self.getandreplace() 
        try: 
            # evaluate the expression using the eval function 
            self.value= eval(self.newtext) 
        except SyntaxError or NameError: 
            self.e.delete(0,END) 
            self.e.insert(0,'Invalid Input!') 
        else: 
            self.sqrtval=math.sqrt(self.value) 
            self.e.delete(0,END) 
            self.e.insert(0,self.sqrtval) 

    def square(self): 
        """square method"""
        self.getandreplace() 
        try: 
            #evaluate the expression using the eval function 
            self.value= eval(self.newtext) 
        except SyntaxError or NameError: 
            self.e.delete(0,END) 
            self.e.insert(0,'Invalid Input!') 
        else: 
            self.sqval=math.pow(self.value,2) 
            self.e.delete(0,END) 
            self.e.insert(0,self.sqval) 

    def clearall(self): 
            """when clear button is pressed,clears the text input area"""
            self.e.delete(0,END) 

    def clear1(self): 
            self.txt=self.e.get()[:-1] 
            self.e.delete(0,END) 
            self.e.insert(0,self.txt) 

    def action(self,argi): 
            """pressed button's value is inserted into the end of the text area"""
            self.e.insert(END,argi) 

    def __init__(self,master): 
            """Constructor method"""
            master.title("                     M A T H E A S S                           ")
             
            self.e = Entry(master) 
            self.e.grid(row=0,column=0,columnspan=6,pady=6) 
            self.e.focus_set() #Sets focus on the input text area 

            # Generating Buttons 
            Button(master,text="=",width=15,height=5 ,fg="white", 
                bg="blue",command=lambda:self.equals()).grid( 
                                    row=4, column=4,columnspan=2) 

            Button(master,text='CLEARALL',width=7,height=5, 
                        fg="red", bg="light blue", ###########
            command=lambda:self.clearall()).grid(row=1, column=4) 

            Button(master,text='Clear',width=7,height=5, 
                fg="white",bg="green",                  ############ light green
                command=lambda:self.clear1()).grid(row=1, column=5) 

            Button(master,text="+",width=7,height=5, 
                fg="white",bg="green", 
                command=lambda:self.action('+')).grid(row=4, column=3) 

            Button(master,text="X",width=7,height=5, 
                    fg="blue",bg="orange", 
                    command=lambda:self.action('x')).grid(row=2, column=3) 

            Button(master,text="minus",width=7,height=5, 
                    fg="red",bg="light green", 
                    command=lambda:self.action('-')).grid(row=3, column=3) 

            Button(master,text="Divide",width=7,height=5, 
                fg="blue",bg="orange", 
                command=lambda:self.action('/')).grid(row=1, column=3) 

            Button(master,text="%",width=7,height=5, 
                fg="red",bg="light green", 
                command=lambda:self.action('%')).grid(row=4, column=2) 

            Button(master,text="7",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action('7')).grid(row=1, column=0) 

            Button(master,text="8",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(8)).grid(row=1, column=1) 

            Button(master,text="9",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(9)).grid(row=1, column=2) 

            Button(master,text="4",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(4)).grid(row=2, column=0) 

            Button(master,text="5",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(5)).grid(row=2, column=1) 

            Button(master,text="6",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(6)).grid(row=2, column=2) 

            Button(master,text="1",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(1)).grid(row=3, column=0) 

            Button(master,text="2",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(2)).grid(row=3, column=1) 

            Button(master,text="3",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(3)).grid(row=3, column=2) 

            Button(master,text="0",width=7,height=5, 
                fg="white",bg="blue", 
                command=lambda:self.action(0)).grid(row=4, column=0) 

            Button(master,text="Point",width=7,height=5, 
                fg="black",bg="white", 
                command=lambda:self.action('.')).grid(row=4, column=1) 

            Button(master,text="(",width=7,height=5, 
                fg="blue",bg="orange", 
                command=lambda:self.action('(')).grid(row=2, column=4) 

            Button(master,text=")",width=7,height=5, 
                fg="blue",bg="orange", 
                command=lambda:self.action(')')).grid(row=2, column=5) 

            Button(master,text="Wurzel",width=7,height=5, 
                fg="red",bg="black", 
                command=lambda:self.squareroot()).grid(row=3, column=4) 

            Button(master,text="hoch",width=7,height=5, 
                fg="red",bg="black", 
                command=lambda:self.square()).grid(row=3, column=5) 
         
 
root = Tk() 
root.geometry("600x600+400+400")
obj=calc(root) # object instantiated 
root.mainloop(

OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

22.3.2024
Mit Subprocess konnte ich bis jetzt Exe.Dateien
aus einem GUI-Menue heraus starten, wie hier bereits einmal vorgestellt,
nicht aberPy.Dateien , also sog. Programme.
Diese wurden unter Subprocess immer abgelehnt.

Heute möchte ich ein Expriment vorstellen:
ich glaube, es ist mir weitgehend geiungen
PY.Dateien aus einem GUI-Menue zu starten.
Vorausetzung ist, dass alle notwendigen Dateien
sich innerhalb des gleichen Ordners befinden..
Ich offe, dass ich diesen Ordner vollständig
auf das Forum kriege.
Oswald
OSWALD
User
Beiträge: 359
Registriert: Freitag 18. März 2022, 17:32

22.3.2024
ich hoffe, dass alle DCateien mitgenommen wurden,
Wenn nicht, dann bitte eigene Dateien einsetzen, immer ohne
Dateiende ' ,py'
Leider kriege ich die Originaldaten nicht rüber,
es sei denn ich lade den Originalcode .Mal sehen .
(feed back möglich ??)
Gruß OSWALD

Code: Alles auswählen


import sys
from tkinter import *
from tkinter.filedialog import askopenfilename
import math
from math import *

def code1():
      import  DREIDKUGEL

def code2():
     import   MATPLOBITAP
def code3(): 
      import  DREIDSCHWER

def code4():
      import   WUERFEL    

def code5():  
    import MATHEASS 

def code6(): 
    import FUNKTIONENPLOT 

def code7(): 
  
   import  KOORDINATEN 

 
 


def OpenFile(name):
     name= askopenfilename
     print(askopenfilename)

def About():
    print("VERSUCH; Einbindung von Python-Programmen/Funktionen in  GUI-Menue          " )
 
####################

window = Tk()
window.title("Transfer von Objekten auf eine Subebene") 
window.geometry("500x550")
 
       
menu = Menu(window)
window.config(menu=menu)
filemenu = Menu(menu) 


menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="DREIDKUGEL ", command=code1)
filemenu.add_command(label= "MATPLOBITAP", command=code2)
filemenu.add_command(label= " DREIDSCHWER" ,command  =code3)
filemenu.add_command(label= " Wuefelbunt"  , command = code4)
filemenu.add_command(label= " MATHEASS " , command = code5)
filemenu.add_command(label= "FUNKTIONENPLOT"   , command = code6)
filemenu.add_command(label= "KOORDINATEN " , command = code7)
 
  
filemenu.add_separator()
filemenu.add_command(label="Exit", command=window.quit)
filemenu.add_separator()

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=About)

mainloop()

Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: Das funktioniert so nicht, auch wenn man das nicht in eine EXE umwandelt, weil man keinen Punkt davon mehr als einmal ausführen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

import ist *NICHT* dazu gedacht, das man damit Code ausfuehrt. Es ist dazu gedacht, Code in das Programm zu hieven, den man dann aufrufen kann. Was auch immer in WUERFEL & Co steht muss also

- in eine Datei wuerfel.py (kleingeschrieben), weil das der Konvention entspricht.
- darin muss eine Funktion stehen, zB "ausfuehren".
- und *DIE* wird dann aufgerufen.

Code: Alles auswählen

import wuerfel


...
filemenu.add_command(label="Wuerfel", command=wuerfel.ausfuehren)
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Edit: Habe vergessen zu aktualisieren und sehe __deets__ Beitrag erst jetzt vor dem abschicken. Daher kommt hier ein etwas ähnlicher Beitrag. (Ist ja jetzt schon geschrieben :mrgreen: )

Hallo,

anbei mal ein minimal Beispiel, wie so etwas meiner Meinung nach aussehen könnte.
Es gibt eine Datei `Addition.py` mit folgendem Code:

Code: Alles auswählen

#!/usr/bin/env python

def add_numbers(args):
    return sum(args)

def main():
    print(add_numbers([1, 2, 3]))


if __name__ == '__main__':
    main()
Das ist deine Berechnung, die du in dem GUI aufrufen willst. Damit du das immer und immer wieder machen kannst, musst du eine Funktion haben, die du immer und immer wieder aufrufen kannst. In diesem Fall ist das `add_numbers`. Der Import der Datei wird am Anfang einmal gemacht und dann hast du die Funktion zur Verfügung und die rufst du dann immer wieder auf. Zum Beispiel so:

Code: Alles auswählen

#!/usr/bin/env python

import tkinter as tk
from functools import partial

import Addition


def process_user_input(user_input, result_label):
    try:
        user_input = list(map(float, user_input.get().split(" ")))
    except ValueError:
        result_label["text"] = "Ungültige Eingabe"
        return
    result = Addition.add_numbers(user_input)
    result_label["text"] = result


def main():
    window = tk.Tk()
    window.title("Program-Collection")
    tk.Label(window, text="Zahlen getrennt mit Leerzeichen eingeben").grid(
        row=0, column=0
    )
    user_input = tk.Entry(window)
    user_input.grid(row=0, column=1)
    tk.Label(window, text="Ergebnis:").grid(row=1, column=0)
    result = tk.Label(window)
    result.grid(row=1, column=1)
    tk.Button(
        window, text="Berechne", command=partial(process_user_input, user_input, result)
    ).grid(row=2, column=0)
    window.mainloop()


if __name__ == "__main__":
    main()
Grüße
Dennis

Edit: Das soll *nur* den Import und das Aufrufen der Funktion demonstrieren. Ich weis das @__blackjack__ gerne mal so Sachen wie `-inf` testet und da versagt mein Programm 🫣
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten