ValueError: specify dummy variables for Range(1, 51, 1)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
herttim
User
Beiträge: 19
Registriert: Mittwoch 8. Dezember 2021, 14:18

Hallo zusammen,

ich bin gerade dabei einen Code in ein bestehendes Programm zu implementieren.
Der Hauptteil des Codes schaut wie folgt aus und ist eine einfache for-Schleife zum automatischen Aufstellen einer Matrix:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
from itertools import product

number = range(1, anzahl_scheiben+1, 1)	#(50 Scheiben)
w = (4 / länge_scheibe)

result = []

for k, j in product(number, repeat=2):
    if k == j:
        result.append(w)
            
    else:
        w_kj = (1 / (abs((k - j)) * länge_scheibe)) 
        result.append(w_kj)
Wenn ich diesen Code zusammen mit nachfolgenden Berechnungsschritten ausführen lasse, läuft alles ohne Probleme ab.
Wenn ich diesen Code zusammen mit anderen Berechnungsschritten in mein bestehendes Programm implementiere, dass in einzelne Funktionen gegliedert ist und auf diesem mit einem tkinter-Modul zugegriffen wird, kommt ständig ein solcher Fehler:

Code: Alles auswählen

ValueError: specify dummy variables for Range(1, 51, 1)


Als fehlerhafte Code-Zeile wird dabei die oben dargestellte for-Schleife genannt.

Ich verstehe leider nicht warum es in meinem Programm nicht funktioniert... :cry:
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Du musst schon das Programm zeigen, das den Fehler produziert - nicht irgend einen Code, der keine Probleme hat.
Und bitte die komplette Fehlermeldung inklusive vollständigem Stracktrace, damit man auch sieht, dass sympy den Fehler wirft. Zumindest vermute ich das.
herttim
User
Beiträge: 19
Registriert: Mittwoch 8. Dezember 2021, 14:18

sparrow hat geschrieben: Mittwoch 5. Januar 2022, 07:32 Du musst schon das Programm zeigen, das den Fehler produziert - nicht irgend einen Code, der keine Probleme hat.
Und bitte die komplette Fehlermeldung inklusive vollständigem Stracktrace, damit man auch sieht, dass sympy den Fehler wirft. Zumindest vermute ich das.
Hier mal der wesentliche Auszug aus dem Programm, der Rest sind nur Tkinter Buttons und kleinere Berechnungen:

Code: Alles auswählen

import tkinter as tk
import numpy as np
import pandas as pd
import matplotlib as mtpl
import matplotlib.pyplot as plt
import csv
import sympy as sp
import sys
import time
import itertools


from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,
                                               NavigationToolbar2Tk)
from matplotlib.figure import Figure
from itertools import product
from sympy import *
from tkinter import Menu
from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image
from tkinter.filedialog import asksaveasfile
from tkinter.filedialog import askopenfilename
from tkinter import filedialog as fd
from tkinter.messagebox import showinfo

class HertzschePressung:

def CalculationPressureIB():

anzahl_scheiben = 50
effektive_länge = 11.52 #mm
krümmungsradius = 4.53  #mm
e_modul = 208000        #N/mm^2
einfederung = 0.003     #mm
profilierung = 0.00     #mm
shape = (1, anzahl_scheiben)
fillvalue_einfederung = einfederung
matrix_einfederung = np.full(shape, fillvalue_einfederung)
fillvalue_profilierung = profilierung
matrix_profilierung = np.full(shape, fillvalue_profilierung)

nachgiebigkeit = anzahl_scheiben * ((3.84 * 10 ** (-5)) / effektive_länge ** 0.8) ** (1 / 0.9)
länge_scheibe = (effektive_länge / anzahl_scheiben)
print('Länge Scheibe:', länge_scheibe, 'mm')
number = range(1, anzahl_scheiben+1, 1)
w = (4 / länge_scheibe) 
print('Einfluss Scheibe aus sich selbst:', w, '1/mm')       
result = []
for k, j in product(number, repeat=2):
    if k == j:
        result.append(w)
            
    else:
        w_kj = (1 / (abs((k - j)) * länge_scheibe)) 
        result.append(w_kj)
        
liste_matrix = [result[x:x+anzahl_scheiben] for x in range(0, len(result), anzahl_scheiben)]  

matrix = np.array(liste_matrix)
matrix_transponiert = np.transpose(matrix)
print(matrix_transponiert)

listSum = sum(result)
gewichtung = anzahl_scheiben/listSum

gewichtungsmatrix = gewichtung * matrix 
gewichtungsmatrix_transponiert = gewichtung * matrix_transponiert

resultierende_einfederung = matrix_einfederung - matrix_profilierung

kontaktkraft = ((resultierende_einfederung) ** (1 / 0.9)) * (np.linalg.inv(gewichtungsmatrix_transponiert) * ((nachgiebigkeit * 0.5) ** (-1)))
print('Kontaktkraftmatrix:\n', kontaktkraft)

zeilen_summen = kontaktkraft.sum(axis=1)

lst = []

for x in zeilen_summen:
    lst.append(x)
    
print('Scheibenkräfte:\n',lst)

hertz_pressung = np.sqrt((np.array(lst) * e_modul) / (8 * np.pi * krümmungsradius * länge_scheibe))
print('Hertz´sche Pressung:\n', hertz_pressung)

y_wert = hertz_pressung

plt.plot(y_wert)
plt.xlabel('Scheibenposition [mm]')
plt.ylabel('Flächenpressung [N/mm^2]')
plt.title('Pressungsberechnung')
plt.show()

ErgButton = tk.Button(self.lfErg, text="Berechnen", command=CalculationPressureIB(), bg="orange", width=16)
        ErgButton.grid(row=5, column=6, padx=10, pady=2, sticky="e")

self.window.mainloop()
        
HertzschePressung()  
Und das ist die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):

  File "C:\Users\...\.spyder-py3\20211112_Theorie2_self.py", line 723, in <module>
    HertzschePressung()

  File "C:\Users\...\.spyder-py3\20211112_Theorie2_self.py", line 711, in __init__
    ErgButton = tk.Button(self.lfErg, text="Berechnen", command=CalculationPressureIB(), bg="orange", width=16)

  File "C:\Users\...\.spyder-py3\20211112_Theorie2_self.py", line 659, in CalculationPressureIB
    for k, j in product(number, repeat=2):

  File "C:\Users\...\lib\site-packages\sympy\concrete\products.py", line 605, in product
    prod = Product(*args, **kwargs)

  File "C:\Users\...\lib\site-packages\sympy\concrete\products.py", line 190, in __new__
    obj = ExprWithIntLimits.__new__(cls, function, *symbols, **assumptions)

  File "C:\Users\...\lib\site-packages\sympy\concrete\expr_with_limits.py", line 165, in __new__
    pre = _common_new(cls, function, *symbols, **assumptions)

  File "C:\Users\...\lib\site-packages\sympy\concrete\expr_with_limits.py", line 57, in _common_new
    raise ValueError(

ValueError: specify dummy variables for Range(1, 51, 1)
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

@herrtim: wenn Du schon numpy importierst, warum nutzt Du es dann nicht zum Erzeugen Deiner "Matrix"?

Code: Alles auswählen

numbers = np.atleast_2d(np.arange(1, anzahl_scheiben + 1, dtype=float))
result = abs(numbers - numbers.T)
np.fill_diagonal(result, 0.25)
result = 1 / (result * länge_scheibe)
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Das leidige Thema mit den *-Importen. Jetzt lernst Du an der harten Realität, warum das nie eine gute Idee ist.

Der Code ist immer noch nicht richtig. Da hat es eine unmotivierte `class`-Zeile und die Einrückungen nach def ist falsch.
Auch sind das leicht weniger Zeilen als die 723, die in der Fehlermeldung stehen.
herttim
User
Beiträge: 19
Registriert: Mittwoch 8. Dezember 2021, 14:18

Scheint so als läge es tatsächlich an sympy. Sobald ich den *-Import von sympy deaktiviere funktioniert es...
Nur Frage ich mich, woran das genau liegt?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

herttim hat geschrieben: Mittwoch 5. Januar 2022, 08:31 Nur Frage ich mich, woran das genau liegt?
Du verwendest nicht itertools.product sondern product aus sympy.
herttim
User
Beiträge: 19
Registriert: Mittwoch 8. Dezember 2021, 14:18

Alles klar, ich verstehe.
Dann mache ich mich mal an die Arbeit und behebe das Problem.

Vielen Dank für die hilfreichen Antworten! :)
Antworten