Seite 1 von 1
ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 07:22
von herttim
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...

Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 07:32
von sparrow
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.
Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 08:03
von herttim
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)
Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 08:16
von Sirius3
@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)
Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 08:17
von Sirius3
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.
Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 08:31
von herttim
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?
Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 08:58
von /me
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.
Re: ValueError: specify dummy variables for Range(1, 51, 1)
Verfasst: Mittwoch 5. Januar 2022, 09:04
von herttim
Alles klar, ich verstehe.
Dann mache ich mich mal an die Arbeit und behebe das Problem.
Vielen Dank für die hilfreichen Antworten!
