Класс окна для отображения графика
При работе с диалогом по управлению параметрами пользователь будет иметь возможность изменять количество узлов разбиения расчетной области, поэтому мы должны изменять размерность используемых контейнеров:
void CChildView::Resize () { //===== Число узлов равно N+1 (с учетом 0-го узла) int n = m n + 1; m_Points.resize(n, CDPoint(0.,0.)); m_f.resize(n, 0.); m_r.resize(n, 1.); }
Функция Solve решает систему уравнений методом прогонки:
void CChildView::Solve() { Resize (); int n = m_n + 1; //======= Коэффициенты разностных уравнений vector<double> a(n), b(n), c(n); //======= Коэффициенты прогонки vector<double> d(n), e(n); double h = m L / m_n, // Размер шага вдоль оси х hh = h * h; // Квадрат шага //======= Коэффициенты с 0-м индексом не используются а[0] = 0.; b[0] = 0.; с[0] = 0.; //=== Вычисляем координаты х и коэффициенты уравнений m_Points[0].х = 0.; for (int i=1; i < m_n; i++) { m_Points[i],x = i * h; //======= Смотри формулы (4) a[i] = m_r[i-l]/hh; c[i] = m_r[i]/hh; b[i] = – a[i] – c[i] + m_k; } m_Points[m_n].x = m_L; //======== – Прямой ходпрогонки d[0] = m_gO; //ГУ слева e[0] * m_d0; double den; for (i=1; i < m_n; 1++) { //======= Общий знаменатель den = a[i) * d[i-l] + b[i]; d[i] = – c[i] / den; e[i] = <m_f[i] – a[i] * e[i-l]) / den; } //======= Готовимся к обратному ходу den = 1. – m_gn * d[m_n-l]; //======= Случай некорректно поставленной задачи if (den==0.) { MessageBox ("ГУ заданы некорректно", "Ошибка-",МВ_ОК); return; } //====== Два последних узла используют ГУ справа //======= Смотри формулы (13) m_Points[m_n-l].у = (e[m_n-l] + m_dn * d[m_n-l])/den; m_Points[m_n].y = (m_dn + m_gn* e[m_n-l])/den; //======= Обратный ход прогонки for (i = m_n-2; i >= 0; i--) m_Points[i].y = d[i) * m_Points[i+1].у + e[i]; Invalidate(); }
С помощью инструментов Studio .NET введите в класс CChildView реакцию на сообщение о создании окна WM_CREATE и вставьте в нее единственную строку, которая вызывает функцию Solve. Она формирует и решает систему разностных уравнений, определенную данными по умолчанию. Позже мы создадим диалог по изменению этих данных:
int CChildView::OnCreate(LPCREATESTRUCT IpCreateStruct) { if (CWnd::OnCreate(IpCreateStruct) == -1) return -1; //======= Решаем систему, определенную по умолчанию Solved; return 0; }