Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсова робота з теми Моделювання руху тіла у в...docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
524.93 Кб
Скачать

Список використаних джерел

  1. О.Г. Ревинская, Н.С. Кравченко; Томский политехнический университет. Движение тела в вязкой среде — Томск: Изд-во Томского политехнического университета, 2011 г.

  2. Савельев И.В. Курс общей физики – М.:Наука – 1989 г.

  3. Мышенков В.И., Мышенков Е.В. Численные методы. – 2005 г.

  4. Керниган Б., Ритчи Д. Язык программирования Си — 2-е изд. — М.: Вильямс, 2007. — С. 304.

  5. Мак-Кракен Д.Численные методы и программирование. – 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 Текст програми з коментарями