Witam, piszę program do szukania miejsc zerowych z pomocą bisekcji i siecznych w Pythonie z wykorzystaniem PyQt. Aktualnie mam tylko metodę bisekcji jednak gdy ją kliknę to program się zatrzymuje i tyle. Użytkownik podaje stopień wielomianu oraz zakres szukania kod wygląda następująco:
import sys
import numpy as np
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QPushButton,
QLabel, QGridLayout,
QLineEdit, QApplication)
from matplotlib.pyplot import plot, show
from scipy import interpolate
from numpy import arange, exp
class Program(QWidget):
def __init__(self):
super().__init__()
self.lbl1 = QLabel('Podaj stopień wielomianu')
self.lbl2 = QLabel('Podaj zakres szukania')
self.btn1 = QPushButton('Metoda bisekcji')
self.btn2 = QPushButton('Metoda siecznych')
self.text1 = QLineEdit()
self.text2 = QLineEdit()
siatka = QGridLayout()
siatka.setSpacing(10)
siatka.addWidget(self.lbl1, 1, 0)
siatka.addWidget(self.text1, 1, 1)
siatka.addWidget(self.lbl2, 2, 0)
siatka.addWidget(self.text2, 2, 1)
siatka.addWidget(self.btn1, 3, 0)
siatka.addWidget(self.btn2, 3, 1)
self.btn1.clicked.connect(self.bisectionClicked)
self.setLayout(siatka)
self.setGeometry(300, 300, 450, 150)
self.setWindowTitle('Wyszukiwanie miejsc zerowych')
self.show()
def bisectionClicked(self):
nText=self.text1.text()
n=int(nText)
zakresText=self.text2.text()
zakresSplit=zakresText.split(',');
xp=float(zakresSplit[0])
xk=float(zakresSplit[1])
self.bisekcja(xp,xk,0.01,n);
def wielomian(n,x):
return 5*x**n-7*x**2+3*x+random()
def bisekcja(self,xp,xk,dokladnosc,n):
while np.absolute(xp-xk)>dokladnosc:
punktSrodkowy=(xp+xk)*0.5
if wielomian(n,punktSrodkowy)*wielomian(n,xp)<0:
xk=punktSrodkowy
punktSrodkowy=(xp+xk)*0.5
if wielomian(n,punktSrodkowy)*wielomian(n,xk)<0:
xp=punktSrodkowy
miejsceZero=xk-(xk-xp)*wielomian(n,xk)/(wielomian(n,xk)-wielomian(n,xp))
if miejsceZero is None:
print('Brak znalezionego miejsca zerowego')
else: print(miejsceZero)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Program()
sys.exit(app.exec_())