@@ -132,14 +132,16 @@ class AppForm(QMainWindow):
t_group = QGroupBox(u'Ось T')
t_layout = QFormLayout(t_group)
- self.edit_t_start = QLineEdit(str(10))
- self.edit_t_end = QLineEdit(str(100))
- self.edit_t_step = QLineEdit(str(10))
+ self.edit_k_start = QLineEdit(str(10))
+ self.edit_k_end = QLineEdit(str(100))
+ self.edit_k_step = QLineEdit(str(10))
+ self.edit_k_M = QLineEdit(str(600))
self.t_norm_button = QPushButton(u'Пуск')
self.connect(self.t_norm_button, SIGNAL("clicked()"), self.on_test_ht)
- t_layout.addRow(u'Мин. узлов', self.edit_t_start)
- t_layout.addRow(u'Макс. узлов', self.edit_t_end)
- t_layout.addRow(u'Шаг', self.edit_t_step)
+ t_layout.addRow(u'Мин. узлов', self.edit_k_start)
+ t_layout.addRow(u'Макс. узлов', self.edit_k_end)
+ t_layout.addRow(u'Шаг', self.edit_k_step)
+ t_layout.addRow(u'Ряд', self.edit_k_M)
t_layout.addRow(self.t_norm_button)
return t_group
@@ -153,12 +155,14 @@ class AppForm(QMainWindow):
self.edit_y_end = QLineEdit('100')
self.edit_y_step = QLineEdit('10')
self.edit_y_ht = QLineEdit('1e-16')
+ self.edit_y_M = QLineEdit(str(600))
self.y_norm_button = QPushButton(u'Пуск')
self.connect(self.y_norm_button, SIGNAL("clicked()"), self.on_test_hy)
y_layout.addRow(u'Мин. узлов', self.edit_y_start)
y_layout.addRow(u'Макс. узлов', self.edit_y_end)
y_layout.addRow(u'Шаг', self.edit_y_step)
y_layout.addRow(u'ht', self.edit_y_ht)
+ y_layout.addRow(u'Ряд', self.edit_y_M)
y_layout.addRow(self.y_norm_button)
return y_group
@@ -171,16 +175,25 @@ class AppForm(QMainWindow):
self.edit_z_end = QLineEdit('100')
self.edit_z_step = QLineEdit('10')
self.edit_z_ht = QLineEdit('1e-16')
+ self.edit_z_M = QLineEdit(str(600))
self.z_norm_button = QPushButton(u'Пуск')
self.connect(self.z_norm_button, SIGNAL("clicked()"), self.on_test_hz)
z_layout.addRow(u'Минимально узлов', self.edit_z_start)
z_layout.addRow(u'Максимально узлов', self.edit_z_end)
z_layout.addRow(u'Шаг', self.edit_z_step)
z_layout.addRow(u'ht', self.edit_z_ht)
+ z_layout.addRow(u'Ряд', self.edit_z_M)
z_layout.addRow(self.z_norm_button)
return z_group
+ def _set_solver(self, t):
+ if t:
+ self.Solver = ExplicitSolver
+ else:
+ self.Solver = ImplicitSolver
+ print self.Solver
+
def _make_norm_frame(self):
self.norm_frame = QWidget()
self.n_fig = Figure((5.0, 4.0), dpi = self.dpi)
@@ -196,6 +209,7 @@ class AppForm(QMainWindow):
scheme_type_layout = QGridLayout(scheme_type_frame)
self.exp_radio_button = QRadioButton(u'Явная схема', scheme_type_frame)
self.imp_radio_button = QRadioButton(u'Неявная схема', scheme_type_frame)
+ self.connect(self.exp_radio_button, SIGNAL("toggled(bool)"), self._set_solver)
self.exp_radio_button.setChecked(True)
scheme_type_layout.addWidget(self.exp_radio_button, 0, 0)
scheme_type_layout.addWidget(self.imp_radio_button, 0, 1)
@@ -251,7 +265,54 @@ class AppForm(QMainWindow):
# self.work_frame.addTab(self.about_frame, u"&О программе")
def on_test_ht(self):
- pass
+ print self.Solver
+
+ try:
+ ly, lz, c, lambda_, t = self._parse_args()
+ I, J = self._parse_grid()
+ k_min = int(str(self.edit_k_start.text()))
+ k_max = int(str(self.edit_k_end.text()))
+ k_step = int(str(self.edit_k_step.text()))
+ M = int(str(self.edit_k_M.text()))
+ except ValueError:
+ QMessageBox.critical(
+ self,
+ u'Ошибка',
+ u'Параметры введены в неверном формате.<br />Пожалуйста, исправьте их и повторите.')
+ return
+
+ x_vals = []
+ y_vals = []
+ hz = lz / J
+ hy = ly / I
+
+ if not co.test_exp_stable(ly/I, lz/J, t / k_min):
+ warn = QMessageBox.warning(
+ self,
+ u'Явная схема',
+ u'С такими параметрами система может быть неустойчива!<br />Вы уверены, что хотите продолжить?',
+ QMessageBox.Yes | QMessageBox.No)
+ if (warn == QMessageBox.No):
+ return
+
+ for k_cur in xrange(k_min, k_max + 1, k_step):
+ ht = t / k_cur
+ print k_cur, ht
+ x_vals.append(ht)
+ solver = self.Solver(I, J, t, ht, ly=ly, lz=lz, lambda_=lambda_, C=c)
+ u = solver.solve()
+ for i in xrange(u.shape[0]):
+ for j in xrange(u.shape[1]):
+ u[i, j] -= Exm(i * hy, j * hz, t, M)
+ y_vals.append(np.max(np.abs(u)))
+
+ self.n_axes.clear()
+ line, = self.n_axes.plot(x_vals, y_vals, '.-')
+
+ self.n_axes.grid(True)
+ self.n_axes.set_xlabel(u'ht')
+ self.n_axes.set_ylabel(u'err')
+ self.n_canvas.draw()
def on_test_hy(self):
try:
@@ -261,6 +322,7 @@ class AppForm(QMainWindow):
i_max = int(str(self.edit_y_end.text()))
i_step = int(str(self.edit_y_step.text()))
ht = np.float64(str(self.edit_y_ht.text()))
+ M = int(str(self.edit_k_M.text()))
except ValueError:
QMessageBox.critical(
self,
@@ -281,12 +343,11 @@ class AppForm(QMainWindow):
if (warn == QMessageBox.No):
return
- M = 750
for i_cur in xrange(i_min, i_max + 1, i_step):
hy = ly / i_cur
print i_cur, hy
x_vals.append(hy)
- solver = ExplicitSolver(i_cur, J, t, ht, ly=ly, lz=lz, lambda_=lambda_, C=c)
+ solver = self.Solver(i_cur, J, t, ht, ly=ly, lz=lz, lambda_=lambda_, C=c)
u = solver.solve()
for i in xrange(u.shape[0]):
for j in xrange(u.shape[1]):
@@ -298,7 +359,7 @@ class AppForm(QMainWindow):
self.n_axes.grid(True)
self.n_axes.set_xlabel(u'hy')
- self.n_axes.set_ylabel(u'eps')
+ self.n_axes.set_ylabel(u'err')
self.n_canvas.draw()
def on_test_hz(self):
@@ -309,6 +370,7 @@ class AppForm(QMainWindow):
j_max = int(str(self.edit_z_end.text()))
j_step = int(str(self.edit_z_step.text()))
ht = np.float64(str(self.edit_z_ht.text()))
+ M = int(str(self.edit_k_M.text()))
except ValueError:
QMessageBox.critical(
self,
@@ -329,12 +391,11 @@ class AppForm(QMainWindow):
if (warn == QMessageBox.No):
return
- M = 750
for j_cur in xrange(j_min, j_max + 1, j_step):
hz = lz / j_cur
print j_cur, hz
x_vals.append(hz)
- solver = ExplicitSolver(I, j_cur, t, ht, ly=ly, lz=lz, lambda_=lambda_, C=c)
+ solver = self.Solver(I, j_cur, t, ht, ly=ly, lz=lz, lambda_=lambda_, C=c)
u = solver.solve()
for i in xrange(u.shape[0]):
for j in xrange(u.shape[1]):
@@ -346,7 +407,7 @@ class AppForm(QMainWindow):
self.n_axes.grid(True)
self.n_axes.set_xlabel(u'hz')
- self.n_axes.set_ylabel(u'eps')
+ self.n_axes.set_ylabel(u'err')
self.n_canvas.draw()
def on_grid_change(self):