Программа
' Решение дифура y'=f(x,y)
' при известных начальных условиях
' x0, y0=f(x0) методом Рунге-Кутта
' с выводом графика
DEF FNDerivative! (X!, Y!) = 2 * X! 'Производная
DEF FNDifRunKutt! (X!, Y!, Stp!) = Y! + Stp!*(FNDerivative!(X!,Y!) + 4 * FNDerivative!(X! + Stp! / 2,Y!) + FNDerivative!(X! + S!,Y!)) / 6
'Вычисление значения исходной функции
DEF FNF! (X!,Y!,Stp!) = FNDifRunKutt! (X!,Y!,Stp!) 'Отображаемая функция
SUB OutGraph (X0!, Y0!, Right!, Stp!) ' Процедура вывода графика
MaxX% = 319: MaxX% = 719 'Максимальная координата X
MaxY% = 199: MaxY% = 347 'Максимальная координата Y
LINE (0, 0)-(MaxX%, MaxY%), 15, B 'Прорисовка рамки
ScaleX! = (Right! - X0!) / (MaxX% * 8) * 10 'Вычисление масштаба по оси X
IF ScaleX! = 0 THEN ScaleX! = 1
'Если масштаб по оси X равен 0, то переопределение масштаба
'Поиск максимального и минимального значений функции на выводимом промежутке:
HiY! = Y0! 'Начальное определение максимума
LoY! = HiY! 'Начальное определение минимума
Y! = Y0! 'Начальное определение предыдущего значения Y
FOR i% = 1 TO CINT((Right!-X0!)/Stp!)-1
'Цикл просмотра значений функции на выводимом промежутке
Y! = FNF!(X0! + i% * Stp!, Y!, Stp!) 'Вычисление функции в текущей точке
IF Y! > HiY! THEN 'Если значение функции перевосходит максимальное
HiY! = Y! 'то переопределение
'максимального значения функции
ELSEIF Y! < LoY! THEN
'Иначе, если значение функции меньше минимального
'то переопределение минимального значения функции
LoY! = Y!
END IF
NEXT i%
ScaleY! = (HiY! - LoY!) / (MaxY% * 8) * 10 'Вычисление масштаба по оси Y
IF ScaleY! = 0 THEN ScaleY! = 1
'Если масштаб по оси Y равен 0, то переопределение масштаба
Y! = Y0! 'Начальное определение предыдущего значения Y
PSET (CINT(MaxX% / 10), CINT(MaxY% * 9 / 10 - (Y! - LoY!) / ScaleY!)), 15
'Прорисовка первой точки графика
FOR i% = 1 TO CINT((Right!-X0!)/Stp!)-1 'Цикл прорисовки графика
Y! = FNF!(X0!+i%*Stp!, Y!, Stp!)
LINE -(CINT((0.1+i%*Stp!/(Right!-X0!)*0.8)*MaxX%), CINT(MaxY% * 9 / 10 - (Y! - LoY!) / ScaleY!)), 15
'Прорисовка линии от предыдущей точки к текущей
NEXT i%
OXy! = MaxY% * 9 / 10 + LoY! / ScaleY! 'Вычисление Y-координаты оси OX
'Определение масок типа линий:
HiColor% = &HFFFF
LoColor% = &HF0F0
'Если Y-координата оси OX выходит за границу вывода, то переопределение
'Y-координаты и определение типа линии:
IF OXy! > MaxY% * 19 / 20 THEN
OXy! = MaxY% * 19 / 20
Style% = LoColor%
ELSEIF OXy! < MaxY% / 20 THEN
OXy! = MaxY% / 20
Style% = LoColor%
ELSE
Style% = HiColor%
END IF
LINE (CINT(MaxX% / 20), CINT(OXy!))-(CINT(MaxX% * 19 / 20), CINT(OXy!)), 15, , Style%
'Прорисовка оси OX
'Прорисовка стрелки на оси OX:
LINE (CINT(MaxX% * 19 / 20), CINT(OXy!))-(CINT(MaxX% * 18.5 / 20), CINT(OXy! + MaxY% / 90)), 15
LINE (CINT(MaxX% * 19 / 20), CINT(OXy!))-(CINT(MaxX% * 18.5 / 20), CINT(OXy! - MaxY% / 90)), 15
OYx! = MaxX% / 10 - X0! / ScaleX! 'Вычисление X-координаты оси OY
'Если X-координата оси OY выходит за границу вывода, то переопределение
'X-координаты и определение типа линии:
IF OYx! > MaxX% * 19 / 20 THEN
OYx! = MaxX% * 19 / 20
Style% = LoColor%
ELSEIF OYx! < MaxX% / 20 THEN
OYx! = MaxX% / 20
Style% = LoColor%
ELSE
Style% = HiColor%
END IF
LINE (CINT(OYx!), CINT(MaxY% / 20))-(CINT(OYx!), CINT(MaxY% * 19 / 20)), 15, , Style%
'Прорисовка оси OY
'Прорисовка стрелки на оси OY:
LINE (CINT(OYx!), CINT(MaxY% / 20))-(CINT(OYx! + MaxX% / 120), CINT(MaxY% / 20 + MaxY% * 9 / 160)), 15
LINE (CINT(OYx!), CINT(MaxY% / 20))-(CINT(OYx! - MaxX% / 120), CINT(MaxY% / 20 + MaxY% * 9 / 160)), 15
END SUB
'-------------------------------------------------------------------------------
SCREEN 2 'Переключение видеосистемы в графический режим
CALL OutGraph(-4,16,4,0.1) 'Вывод графика
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию