RuntimeWarning: недопустимое значение обнаружено в double_scalars и TypeError: объект 'NoneType' не вызывается - PullRequest
1 голос
/ 25 мая 2020

Я использую tkinter для создания GUI, который сохраняет графики из решенной системы ODe. Код выглядит следующим образом:

from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
from numpy import *
import tkinter as tk
from tkinter import IntVar

#creating function with the LV equations within it, first listing all parameters

def startwindow():
    startwindow = tk.Tk()
    startwindow.geometry('300x300')
    startwindow.title('Enter values')

#need values for - min time, max time, two y0 values, carrying capacity, growth rates for R and C, alphaCR and alphaR, no. of samples

tk.Label(startwindow, text = 'Start time', font = ('verdana')).grid(row=0)
tk.Label(startwindow, text = 'End time', font = ('verdana')).grid(row=1)
tk.Label(startwindow, text = 'R', font = ('verdana')).grid(row=2)
tk.Label(startwindow, text = 'C', font = ('verdana')).grid(row=3)
tk.Label(startwindow, text = 'Carrying capacity', font = ('verdana')).grid(row=4)
tk.Label(startwindow, text = 'R growth rate', font = ('verdana')).grid(row=5)
tk.Label(startwindow, text = 'C growth rate', font = ('verdana')).grid(row=6)
tk.Label(startwindow, text = 'alphaCR', font = ('verdana')).grid(row=7)
tk.Label(startwindow, text = 'alphaRC', font = ('verdana')).grid(row=8)
tk.Label(startwindow, text = 'No. of samples', font = ('verdana')).grid(row=9)

getmintime = IntVar()
mintimeBox = tk.Entry(startwindow, textvariable = getmintime, width=3)
mintimeBox.grid(row=0, column=1)           

getmaxtime = IntVar()
maxtimeBox = tk.Entry(startwindow, textvariable = getmaxtime, width=3)
maxtimeBox.grid(row=1, column=1)           

getR = IntVar()
rBox = tk.Entry(startwindow, textvariable = getR, width=3)
rBox.grid(row=2, column=1)           

getC = IntVar()
cBox = tk.Entry(startwindow, textvariable = getC, width=3)
cBox.grid(row=3, column=1)           

getCap = IntVar()
capBox = tk.Entry(startwindow, textvariable = getCap, width=3)
capBox.grid(row=4, column=1)           

getRgrow = IntVar()
rGrowBox = tk.Entry(startwindow, textvariable = getRgrow, width=3)
rGrowBox.grid(row=5, column=1)           

getCgrow = IntVar()
cGrowBox = tk.Entry(startwindow, textvariable = getCgrow, width=3)
cGrowBox.grid(row=6, column=1)           

getalphaCR = IntVar()
alphaCRBox = tk.Entry(startwindow, textvariable = getalphaCR, width=3)
alphaCRBox.grid(row=7, column=1)           

getalphaRC = IntVar()
alphaRCBox = tk.Entry(startwindow, textvariable = getalphaRC, width=3)
alphaRCBox.grid(row=8, column=1)           

getSamples = IntVar()
samplesBox = tk.Entry(startwindow, textvariable = getSamples, width=3)
samplesBox.grid(row=9, column=1)           


readmin = getmintime.get()
readmax = getmaxtime.get()
readR = getR.get()
readC = getC.get()
readcap = getCap.get()
readRgrow = getRgrow.get()
readCgrow = getCgrow.get()
readalphaCR = getalphaCR.get()
readalphaRC = getalphaRC.get()
readsamples = getSamples.get()

intmin = int(readmin)
intmax = int(readmax)
intR = int(readR)
intC = int(readC)
intcap = int(readcap)
intRgrow = int(readRgrow)
intCgrow = int(readCgrow)
intalphaCR = int(readalphaCR)
intalphaRC = int(readalphaRC)
intsamples = int(readsamples)

def lotkavolterra(t, X, readcap, readRgrow, readCgrow, readalphaCR, readalphaRC):
    readR, readC = X
    return [(readRgrow*readR)*((readcap - readR- (readalphaCR*readC)) / readcap), (readCgrow*readC)*((readcap - readC - (readalphaRC*readR)) / readcap)]




def solveandplot():

    solve = solve_ivp(lotkavolterra, [readmin, readmax], [readR, readC], args=(readcap, readRgrow, readCgrow, readalphaRC, readalphaRC), dense_output=True) #passing through the values into the scipy solver

    t = linspace(readmin, readmax, readsamples) #start and stop times and the no. of samples to generate
    X = solve.sol(t)
    plt.plot(t, X.T)
    plt.legend(['R', 'C'])
    plt.title('Lotka-Volterra System')
    #plt.savefig('Lotka-Volterra System.png')
    plt.show()



btn = tk.Button(startwindow, text='Plot graph', command = lambda: solveandplot(), font = ('verdana'))
btn.grid(row=10)





startwindow.mainloop()




startwindow()

Ошибка, с которой я столкнулся, говорит:

/Users/Desktop/Project/GUI LV.py:104: RuntimeWarning: invalid value encountered in double_scalars
  return [(readRgrow*readR)*((readcap - readR - (readalphaCR*readC)) / readcap), (readCgrow*readC)*((readcap - readC - (readalphaRC*readR)) / readcap)]
Exception in Tkinter callback
Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/Users/isa/Desktop/Project/GUI LV.py", line 119, in <lambda>
    btn = tk.Button(startwindow, text='Plot graph', command = lambda: solveandplot(), font = ('verdana'))
  File "/Users/isa/Desktop/Project/GUI LV.py", line 110, in solveandplot
    X = solve.sol(t)
TypeError: 'NoneType' object is not callable

Почему он говорит это и почему я не могу делать то, что собираюсь делать с это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...