Final?
author[email protected] <muha@hp.(none)>
Mon, 21 Dec 2009 16:57:35 +0000 (21 20:57 +0400)
committer[email protected] <muha@hp.(none)>
Mon, 21 Dec 2009 16:57:35 +0000 (21 20:57 +0400)
gui.py

diff --git a/gui.py b/gui.py
index 7932330..e0794dc 100644 (file)
--- a/gui.py
+++ b/gui.py
@@ -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):