Иллюстрированный самоучитель по Visual Studio.Net




Класс окна для отображения графика - часть 2


//===== Решение системы методом прогонки

void Solve();

protected:

afx_msg void OnPaint();

DECLARE_MESSAGE_MAP() };

Точки графика будем хранить в контейнере объектов класса CDPoint, который мы неоднократно использовали, так как исследователи реальных систем работают с вещественными координатами. Переход к экранным координатам будет произведен в классе CGraph. Инициализацию данных проведите в конструкторе оконного класса:

CChildView: :CChildView()

{

m_n = 200;

m_k = -0.0005;

m_L = 200.;

//====== Слева ГУ первого рода Uo=100

m_g0 = 0.;

m_d0 =100.;

m_gn = 0.;

m_dn = 0.;

Resize () ;

m_pDlg = 0;

}

В деструктор вставьте коды освобождения памяти, занимаемой контейнерами:

CChildView::~CChildView()

{

m_Points.clear();

m_f.clear();

m_r.clear();

}

При работе с диалогом по управлению параметрами пользователь будет иметь возможность изменять количество узлов разбиения расчетной области, поэтому мы должны изменять размерность используемых контейнеров:

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++)




Содержание  Назад  Вперед