- •Основы алгоритмизации и языки программирования Учебно-методическое пособие
- •Содержание
- •Лабораторная работа №1. Базовые языковые конструкции vfp и vba. Основы работы с данными
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №2. Определение корней уравнений Определение корня уравнения методом деления отрезка пополам (дихотомии)
- •Определение корня одномерного уравнения методами касательных и секущих
- •Определение корня одномерного уравнения методом простой итерации
- •Задания
- •Контрольные вопросы
- •Определение максимального и минимального значения функции двух переменных методом градиентного спуска (подъема)
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №4. Рекурсия. Рекурсивные алгоритмы Рекурсия. Рекурсивные алгоритмы
- •Графика и рекурсивные алгоритмы
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №5. Аппроксимация, интерполяция и экстраполяция Простейшие способы интерполяции и экстраполяции данных
- •Аппроксимация выборки случайных чисел методом наименьших квадратов
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №6. Решение систем линейных уравнений Решение систем линейных уравнений методом Гаусса
- •Решение систем линейных уравнений методом Гаусса с выбором максимального элемента
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №7. Итерационные методы решения систем линейных уравнений. Приложения численных методов решения систем линейных уравнений Метод Зейделя
- •Метод Гаусса-Зейделя
- •Обращение матрицы nхn с использованием метода Гаусса
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №8. Вычисление определенных интегралов Вычисление определенных интегралов методом прямоугольников
- •Вычисление определенных интегралов методом трапеций
- •Вычисление интеграла по методу Симпсона
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №9. Численное решение дифференциальных уравнений Методы численного решения дифференциальных уравнений первого порядка
- •Метод Эйлера
- •Метод Кранка-Николсона
- •Метод Рунге-Кутты четвертого порядка для решения уравнения первого порядка
- •Методы численного решения систем дифференциальных уравнений Гармонические колебания
- •Затухающие колебания
- •Периодический процесс с затуханием и с внешней силой
- •Решение системы дифференциальных уравнений методом Эйлера
- •Решение системы дифференциальных уравнений первого порядка методом Рунге-Кутты
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №10. Генерация равномерных и неравномерных распределений случайных чисел Использование гистограмм для отображения характера распределения случайной величины
- •Генератор дискретно-распределенных значений
- •Генерация дискретных распределений с заданным характером распределения вероятностей
- •Генерация непрерывных распределений вещественных величин Псевдонормальное распределение
- •Генерация линейно возрастающего распределения
- •Контрольные вопросы
- •Задания
- •Список рекомендуемой литературы и источников
Решение системы дифференциальных уравнений первого порядка методом Рунге-Кутты
Система обыкновенных дифференциальных уравнений высшего порядка путем введения новых неизвестных может быть сведена к системе уравнений первого порядка. Рассмотрим такую систему
yi ' = Fi (x, y) (26)
где i = 1, ..., n;
y = (y1 , y2 , ..., yn );
y(x0 ) = y (0) =(y (0)1 , ..., y (0)n ).
Методе Рунге-Кутта четвертого порядка вычисляет значение yi k по формуле:
yi(k+1) = yi (k) + (k1(i)+2k2(i)+2k3(i)+k4(i))/6 (27)
где:
k1(i) = Fi (x (k), y (k))h
k2(i) = Fi (x(k)+h/2, y(k)+k1(i)/2)h
k3(i) = Fi (x(k)+h/2, y(k)+k2(i)/2)h
k4(i) = Fi (x(k)+h, y(k)+k3(i))h,
h = (xn -x0)/m
n – количество уравнений системы, m – количество шагов интегрирования. Процедура использует набор функций F(i, x, y), которые соответствуют функциям Fi (x, y), описанным выше.
Описание алгоритма метода Рунге-Кутты решения систем дифференциальных уравнений первого порядка:
Задаем начальное x0 и конечное xn значения отрезка интегрирования, массив начальных значений y0, т.е. значения системы y0(i)… y0(n) в точке x0, а также количество шагов интегрирования m.
Вычисляем шаг интегрирования h.
Задаем цикл по х от x0 до xn с шагом h.
На основе известных x0 и y0(1)… y0(n) вычисляем правые части системы для всех n уравнений.
Вычисляем коэффициенты k1 и для всех n уравнений.
Вычисляются коэффициенты k2, k3, k4 для всех n уравнений системы в соответствии с формулами метода.
Вычисляем y1… yт для первого шага интегрирования в соответствии с главной формулой метода.
Итерации повторяются для вычисления состояний системы на каждом шаге интегрирования.
Конец цикла по х.
Конец алгоритма.
Описание алгоритма
метода Рунге-Кутты решения системы
дифференциальных уравнений первого
порядка
с начальными условиями
,
при x
изменяющемся от 0 до
на естественном языке:
n=количество_уравнений
y0=начальной_значение
m=количество_шагов_интегрирования
Определить Массив y(m)
Цикл по i от 1 до m с шагом 1
y(1)=0
y(2)=1
Конец Цикла
Вызвать runge_sys(0,2*PI(),@y,m,n)
Процедура runge_sys
Параметры xn,xe,y0,m,n
Определить Массив y0(m)
Определить Локальный Массив k1(m),k2(m),k3(m),k4(m),y1(m),y0_(m),f(m)
Локальные переменные i,x0,h
h=(xe-xn)/(n-1) * шаг интегрирования
Цикл по x0 от xn до xe с шагом h
Вызвать правые_части(x0,@y0,@f,m)
Цикл по i от 1 до m
k1(i)=h*f(i)
y0_(i) = y0(i)+k1(i)/2
Конец Цикла
Вызвать правые_части(x0+h/2,@y0_,@f,m)
Цикл по i от 1 до m
k2(i)=h*f(i)
y0_(i) = y0(i)+k2(i)/2
Конец Цикла
Вызвать правые_части(x0+h/2,@y0_,@f,m)
Цикл по i от 1 до m
k3(i)=h*f(i)
y0_(i) = y0(i)+k3(i)
Конец Цикла
Вызвать правые_части(x0+h,@y0_,@f,m)
Цикл по i от 1 до m
k4(i)=h*f(i)
dk=1/6*(k1(i)+2*k2(i)+2*k3(i)+k4(i))
y1(i)=y0(i)+dk
Конец Цикла
Вызвать вывод_решения(x0+h,@y1,m)
Цикл по i от 1 до m
y0(i) = y1(i)
Конец Цикла
Конец Цикла
Возврат
Конец Процедуры
Процедура правые_части
Параметры x,y,f,n
Определить Массив y(n),f(n)
f(1)=y(2)
f(2)=-y(1)
Возврат
Конец Процедуры
Процедура вывод_решения
Параметры x,y,m
Определить Массив y(m)
Печать x,STR(y(1),10,7),STR(f(x),10,7),STR(ABS(y(1)-f(x)),10,7)
Возврат
Конец Процедуры
Функция f
Параметры x
Возврат SIN(x)
Конец Функции
Реализация алгоритма численного интегрирования системы дифференциальных уравнений первого порядка методом Рунге-Кутта на VFP:
set decimals to 10
clear
n=100
y0=0.5
m=2
DIMENSION y(m)
y(1)=0
y(2)=1
s=""
runge_sys(0,2*PI(),@y,m,n)
STRTOFILE(s,"res.dat")
PROCEDURE runge_sys
PARAMETERS xn,xe,y0,m,n
DIMENSION y0(m)
LOCAL ARRAY k1(m),k2(m),k3(m),k4(m),y1(m),y0_(m),f(m)
LOCAL i,x0,h
h=(xe-xn)/(n-1)
FOR x0 = xn TO xe STEP h
правые_части(x0,@y0,@f,m)
FOR i=1 TO m
k1(i)=h*f(i)
y0_(i) = y0(i)+k1(i)/2
NEXT
правые_части(x0+h/2,@y0_,@f,m)
FOR i=1 TO m
k2(i)=h*f(i)
y0_(i) = y0(i)+k2(i)/2
NEXT
правые_части(x0+h/2,@y0_,@f,m)
FOR i=1 TO m
k3(i)=h*f(i)
y0_(i) = y0(i)+k3(i)
NEXT
правые_части(x0+h,@y0_,@f,m)
FOR i=1 TO m
k4(i)=h*f(i)
dk=1/6*(k1(i)+2*k2(i)+2*k3(i)+k4(i))
y1(i)=y0(i)+dk
NEXT
s= s + вывод_решения(x0+h,@y1,m) + CHR(10)
FOR i=1 TO m
y0(i) = y1(i)
NEXT
NEXT
RETURN
PROCEDURE правые_части
LPARAMETERS x,y,f,n
DIMENSION y(n),f(n)
*? "x=",x
f(1)=y(2)
f(2)=-y(1)
RETURN
ENDPROC
PROCEDURE вывод_решения
PARAMETERS x,y,m
LOCAL s
DIMENSION y(m)
s = STR(x,12,2) + CHR(9) ;
+ STR(y(1),10,7) + CHR(9) ;
+ STR(y(2),10,7) + CHR(10)
RETURN s
ENDPROC
Реализация алгоритма численного интегрирования системы дифференциальных уравнений первого порядка методом Рунге-Кутты на VBA:
Sub runge_sys()
Const PiNumber = 3.14159265358979
Dim y()
Dim k1(), k2(), k3(), k4(), y1(), y_tmp(), f()
dec = 8
n = 100
m = 2 * n
x1 = 0: xn = 2 * PiNumber
ReDim k1(m): ReDim k2(m): ReDim k3(m): ReDim k4(m)
ReDim y1(m): ReDim y_tmp(m): ReDim f(m)
ReDim y(m)
Debug.Print "X Y F(x) ABS(Y-F(x))"
For i = 1 To m Step 2
y(i) = 0
y(i + 1) = 1
Next i
h = (xn - x1) / (n - 1)
For x0 = x1 To xn Step h
Call правые_части(x0, y(), f, m)
For i = 1 To m
k1(i) = h * f(i)
y_tmp(i) = y(i) + k1(i) / 2
Next i
Call правые_части(x0 + h / 2, y_tmp, f, m)
For i = 1 To m
k2(i) = h * f(i)
y_tmp(i) = y(i) + k2(i) / 2
Next i
Call правые_части(x0 + h / 2, y_tmp, f, m)
For i = 1 To m
k3(i) = h * f(i)
y_tmp(i) = y(i) + k3(i)
Next i
Call правые_части(x0 + h, y_tmp, f, m)
For i = 1 To m
k4(i) = h * f(i)
dk = 1 / 6 * (k1(i) + 2 * k2(i) + 2 * k3(i) + k4(i))
y1(i) = y(i) + dk
Next i
Call вывод_решения(x0 + h, y1, m, dec)
For i = 1 To m
y(i) = y1(i)
Next i
Next x0
End Sub
Sub правые_части(x, y, f, n)
'Debug.Print "x=", x
For i = 1 To 200 Step 2
f(i) = y(i + 1)
f(i + 1) = -y(i)
Next i
End Sub
Sub вывод_решения(x, y, m, dec)
dStr = "0."
For i = 1 To dec
dStr = dStr + "0"
Next i
Debug.Print Format(x, dStr), Format(y(1), dStr), Format(f(x), dStr), Format(Abs(y(1) - f(x)), dStr)
'Return
End Sub
Function f(x)
f = Sin(x)
End Function
Рис. 1 График решения
системы дифференциальных уравнений
при
,
на интервале x
= 0 до
.
Сплошная линия – зависимость
,
пунктирная -
.
Рис.2 Фазовый
портрет
решения системы
дифференциальных уравнений
при
,
на интервале x
= 0 до
.
По горизонтальной оси
по вертикальной
оси
