Программа


' Решение дифура 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)   'Вывод графика

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию