Форум сайта python.su
Всем привет, ребят помогите с алгоритмом, есть алгоритм и текст программы, но преподавателю не достаточно такого алгоритма, он хочет более подробный, я уже всю голову сломал. Алгоритм прикреплю рисунком.
Листинг программы:
2.3 Листинг программы с комментариями
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from math import *
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
class Window(QWidget):
def __init__(self, parent=None):
super().__init__()
self.setMinimumSize(400,420) # Минимальный размер окна
self.setMaximumSize(900,500) # Максимальный размер окна
self.t = # Температура
self.e = # Энергия соодурения
self.btn = QPushButton('Расчитать') # Кнопка Расчитать
self.buttonGraf = QPushButton('График') # Кнопка График
self.btn.clicked.connect(self.polinom) # Слушаю кнопку Расчитать
self.buttonGraf.clicked.connect(self.graf) # Слушаю кнопку График
self.tLabel = QLabel('Температура') # Лейбл Температура
self.eLabel = QLabel('Энергия соодурения') # Лейбл Энергия соодурения
self.decision = QLabel('')
self.tLine =
self.eLine =
foriinrange(len(self.t)): # Создание полей значений Температура и Энергия соодурения
tB = QDoubleSpinBox() # Поле Температура
e = QDoubleSpinBox() # Поле Энергия соодурения
tB.setDecimals(3) # Точность Температура 3 знака после запятой
e.setDecimals(3) # Точность Энергия соодурения 3 знака после запятой
e.setMinimum(-1000) # Минимальное значение Энергия соодурения
ifi> 0:
tB.setMinimum(self.t) # Минимальное значение Температура
else:
tB.setMinimum(-1000) # Минимальное значение Температура
e.setMaximum(1000) # Максимальное значение Энергия соодурения
if i < len(self.t) - 1:
tB.setMaximum(self.t) # Максимальное значение Температура
else:
tB.setMaximum(1000) # Максимальное значение Температура
tB.setValue(self.t) # Добавление начального значения X
e.setValue(self.e) # Добавление начального значения X
#stB.valueChanged.connect(self.changeT) # Слушаем поле Температура и при измении вызываем фукцию ограничения X
e.valueChanged.connect(self.changeE) # Слушаем поле Энергия соодурения и при измении вызываем фукцию ограничения X
self.tLine.append(tB) # Добавляем поле Температура в массив tLine
self.eLine.append(e) # Добавляем поле Энергия соодурения в массив eLine
self.d = [, , , , , , ] # Значение полинома
self.function = # Формулы полинома
self.fx = sp.linspace(self.t, self.t + 1, 100) # 100 точек на отрезке Температуры
self.viewport = QWidget()
self.viewport2 = QWidget()
self.scroll2 = QScrollArea(self)
self.scroll2.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.initUI()
def initUI(self):
self.polinom() # Расчет полинома
self.decisionBox('1') # Вызов функции вывода решения для d(1)
gridBox1 = QGridLayout() # Сетка для окна, чтобы вставлять в нее элементы
gridBox1.setSpacing(10) # Отступы между элементами
gridBox1.addWidget(self.btn, 0, 2, 1, 4) # Добавление в сетку кнопки Расчитать
gridBox1.addWidget(self.buttonGraf, 1, 2, 1, 4) # Добавление в сетку кнопки График
gridScroll1 = QGridLayout()
gridScroll1.setSpacing(10)
gridScroll1.addWidget(self.tLabel, 0, 0) # Добавление в сетку лейбл Температура
gridScroll1.addWidget(self.eLabel, 0, 1) # Добавление в сетку лейбл Энергия соодурения
for i in range(len(self.tLine)):
gridScroll1.addWidget(self.tLine, i+1, 0) # Добавление в сетку поле Температура
gridScroll1.addWidget(self.eLine, i+1, 1) # Добавление в сетку поле Энергия соодурения
self.viewport.setGeometry(10,10,400,275)
self.viewport.setLayout(gridScroll1)
box = QVBoxLayout()
box.addItem(gridBox1) # Добавление блока в окно
box.addWidget(self.viewport)
frame = QFrame()
frame.setLayout(box) # Добавляем окно во вкладку 1
combo = QComboBox(self) # Выпадающий список
combo.addItems() # Значения в выпабающем списке (d1 - d7)
combo.activated.connect(self.decisionBox) # Слушаем измения значения в выпадающем списке
gridScroll2 = QGridLayout() # Сетка для окна, чтобы вставлять в нее элементы
gridScroll2.setSpacing(10) # Отступы между элементами
gridScroll2.addWidget(self.decision) # Добавляем решение в окно
self.viewport2.setLayout(gridScroll2)
self.scroll2.setWidget(self.viewport2)
box2 = QVBoxLayout()
box2.addWidget(combo)
box2.addWidget(self.scroll2)
group = QGroupBox()
group.setLayout(box2)
tab = QTabWidget() # Cтек с вкладками виджетов
tab.addTab(frame,“Условия”) # Добавляем вкладку Условия
tab.addTab(group,“Решение”) # Добавляем вкладку Решение
vbox = QVBoxLayout()
vbox.addWidget(tab)
self.setLayout(vbox) # Добавляем стек в окно программы
self.setWindowTitle('lab2') # Задаем название окна программы
gridBox2 = QGridLayout()
defchangeT(self): # Ограничение для полей Температуры и считывание их значений
for i in range(len(self.tLine)):
self.t = self.tLine.value() # Записываем значение Температуры в массив t
if i > 0:
self.tLine.setMinimum(self.tLine.value()) # Минимальное значение для Температуры
if i < len(self.tLine) - 1:
self.tLine.setMaximum(self.tLine.value()) # Максимальное значение для Температуры
defchangeE(self): # Считывание значений Энергиий соодурения
for i in range(len(self.eLine)):
self.e = self.eLine.value() # Записываем значение Энергиий соодурения в массив e
def decisionBox(self, test): # Вывод решения
s = self.function # Вставляем формулу d(test) //test - значение выбраное в выпадающем списке
fun = self.d # fun присвоим значение d(test) // fun - временная переменная // d(test) - массив занчений от 1 до 100
for i in range(len(fun)):
s += “\nd” + str(test) + “(” + str(i + 1) + “) = ” + str(fun) # Записываем d(i) в строку
self.decision.setText(s) # Записываем решение в окно
self.viewport2.adjustSize() # Обновляем размер окна с решением
def polinom(self):# Расчет полинома
for i in range(1, 8): fp, residuals, rank, sv, rcond = sp.polyfit(self.t, self.e, i, full=True) # Получаем полином
fu = sp.poly1d(fp) # Формула полинома d
fun = ‘'
forzinrange(len(fu), -1, -1): # Записываем формулу полинома в строку
if z < len(fu):
fun += ’ + ‘
else:
fun += ’d(%i) = '%z
fun += str(fu)
if z != 0:
fun += “* x^%i”%z
else:
fun += “\n”
self.function = fun # Записываем формулу(строку) в массив
self.d = fu(self.fx) # Записываем значение полинома в массив
def graf(self):
legend =
for i in range(len(self.d)):
plt.plot(self.fx, self.d, linewidth=2, alpha=0.5) # График d
legend.append(“d = %i”%(i+1)) # Текст d = i
plt.legend(legend, loc=“upper left”) # Добавляем подпись к графику
plt.scatter(self.t, self.e,alpha=1)
plt.grid()
plt.show()
if __name__ == ‘__main__’:
app = QApplication(sys.argv)
widget = Window()
widget.show()
sys.exit(app.exec_())
Прикреплённый файлы: алг №2.JPG (23,2 KБ)
Офлайн
1) Листинг нужно помещать в специальный тег. Иначе он становится не читаемым.
2) Из твоего рисунка вообще не понятно что происходит. Например что означает действие "Получаю F(формулу d полинома)"? Наверное от тебя хотят что бы ты подробнее эти действия расписал.
Офлайн