
- •Курсова робота
- •Моделювання руху тіла у в’язкому середовищі
- •Розділ 1
- •Рух тіла у в'язкому середовищі
- •В'язкість (внутрішнє тертя) і в'язкопружність
- •Актуальність данної роботи
- •Поставлена задача
- •Розділ 2. Методика
- •Метод Рунге-Кутти
- •Інструмент. Мова програмування Сі
- •Алгоритм вирішення
- •Структура програми
- •Розділ 3. Результати
- •3.1 Результат роботи програми
- •Висновки
- •Список використаних джерел
- •Додаток б. Блок схеми програми
Список використаних джерел
О.Г. Ревинская, Н.С. Кравченко; Томский политехнический университет. Движение тела в вязкой среде — Томск: Изд-во Томского политехнического университета, 2011 г.
Савельев И.В. Курс общей физики – М.:Наука – 1989 г.
Мышенков В.И., Мышенков Е.В. Численные методы. – 2005 г.
Керниган Б., Ритчи Д. Язык программирования Си — 2-е изд. — М.: Вильямс, 2007. — С. 304.
Мак-Кракен Д.Численные методы и программирование. – 1990 г.
Додаток А. Текст програми
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define g 9.80665 double ro_fluid = 10, ro_body = 100; double teta = 100; double R = 2; |
|
double f(double x, double V) { return g * (1.0 - ro_fluid / ro_body) - 4.5 * teta * V / (ro_body * R * R); } double* RungeCuttaV(double t0, double tend, double h, double Y0, double V0) { double tn, Vn = V0; |
//
Функція f
з диф. рівняння
// Знаходження швидкості методом Рунге-Кутти |
double tau = ro_body * R * R / (4.5 * teta double U = (1 - ro_fluid / ro_body) * g * tau;
int N = (tend - t0) / h; double* VArr = (double*)malloc(N * sizeof(double));
int i = 0; |
// Коефіціенти з диф. рівняння
// Створюємо масив
// Лічільник елементів |
for (tn = t0; tn < tend; tn += h) { double k1, k2, k3, k4 double Vn1; k1 = f(tn, Vn); k2 = f(tn + h / 2, Vn + k1 * h / 2); k3 = f(tn + h / 2, Vn + k2 * h / 2); k4 = f(tn + h, Vn + k3 * h); Vn1 = Vn + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;
|
// Коефіцієнти метода Рунге-Кутти |
printf("V(runge)(%lf) = %lf, V(real)(%lf) = %lf\n", tn, Vn, tn, U * (1 - exp (- tn / tau))); |
// Виводимо значення швидкості, знайдені методом Рунге та із точної формули. |
VArr[i++] = Vn1;
Vn = Vn1; } return VArr; } void RungeCuttaY(double t0, double tend, double h, double Y0, double V0) { |
// Записуємо значення у масив.
// Знаходимо координату методом Рунге із рівняння dY/dt = V, де V – це значення знайдені функцією RungeCuttaV |
double* VArr = RungeCuttaV(t0, tend, 0.5 * h, Y0, V0); int i = 0;
double tn, Yn = Y0;
double tau = ro_body * R * R / (4.5 * teta); double U = (1 - ro_fluid / ro_body) * g * tau;
printf("\n time | Y (runge) | Y (pres.form)\n" "-----------+-------------+--------------\n");
for (tn = t0; tn < tend; tn += h, i++) { double k1, k2, k3, k4; double Yn1; |
// У методі потрібно використати значення у момент часу кратні не лише інтервалу, та і його половині, тому треба знайти значення швидкості у два рази більшим числі точок (крок робимо у два рази меншим) |
k1 = VArr[i * 2] k2 = k3 = VArr[i * 2 + 1] k4 = VArr[i * 2 + 2]; Yn1 = Yn + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6.0; |
// VArr – значення швидкості у потрібні моменти часу. Парні елементи – у моменти, кратні інтервалу. |
printf("%9.5lf | %10.6lf | %10.6lf \n", tn, Yn, U * (tn - tau * (1 - exp (-tn / tau))));
Yn = Yn1; } } |
// Виводимо значення координат, знайдених методом Рунге-Кутти та значення із точної формули. |
void ReadData() { printf("Plotnost jitkosti (kg/m^3): "); scanf("%lf", &ro_fluid); printf("Plotnost tela (kg/m^3): "); scanf("%lf", &ro_body); printf("Koeficient vyazkosti (Pa*c): "); scanf("%lf", &teta); printf("Radius shara (m): "); scanf("%lf", &R); } |
// Фізичні параметри.
// Щільність рідини
// Щільність тіла
// Коефіцієнт в’язкості
// Радіус кулі
|
int main() { double t, dt; ReadData(); printf("Enter vremennoi interval: "); scanf("%lf", &t); printf("Enter shag: "); scanf("%lf", &dt); RungeCuttaY(0, t, dt, 0, 0); getch(); return 0; } |
// Кінцевий момент часу
//Часовий інтервал(крок) між двома послідовними моментами
|
Рис. 3 Текст програми з коментарями