Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2010, 21:36   #1
Craz
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 21
По умолчанию Метод Рунге-Кутта_мерсона для системы из 3 уравнений

Всем Доброе Время Суток!
Я пытаюсь составить алгортм решения системы дифференциальных 3 уравнений. Написал прогу для системы из 2-х уравнений, а теперь патыюсь переделать под 3 уравнения.
Очень прошу помочь мне с этой проблемой, тк завтра сдавать курсач...
Вот моя попытка для 2 уравнений, которую я переделываю для 3 уравнений. Помогите плиз сделать прогу для 3 уравнений...
Очень прошу помочь мне с этой проблемой, тк завтра сдавать курсач...

#include <stdio.h>
#include <conio.h>
#include <math.h>

const double t = 1e-3;
float x1,x2,x3,a,b,t0,tk;
float c1,c2,c3,c4;

double func1 (double x1, double x2, double x3)
{x1=-c2*x1+c1*x2*x3+c1*x1*x2;
return x1;}

double func2 (double x1, double x2, double x3)
{x2=c1*x2+c3*x3-c1*x1*x3;
return x2;}

double func3 (double x1, double x2, double x3)
{x3=-c4*x3+c1*x1*x2;
return x3;}

int main ()
{
float x,y1,y2,y3,k1,k2,k3,k4,k5,r,h,d1,d2 ,d3;
clrscr();
c1=1; c2=3; c3=20; c4=10;
printf("\n x1=");
scanf("%f", &x1);
printf("\n x2=");
scanf("%f", &x2);
printf("\n x3=");
scanf("%f", &x3);
printf("\n t0=");
scanf("%f", &t0);
printf("\n tk=");
scanf("%f", &tk);

cprintf("\n Metod Runge-Kutta-Mersona");
h=tk/20;
y1=x1;
y2=x2;
y3=x3;

for (a=t0; a<=tk+t; a+=h)
{
k1=h*func1(x1,x2,x3);
k2=h*func1(x1+(1/3)*h,x2+(1/3)*k1);
k3=h*func1(x1+(1/3)*h,x2+(1/6)*k1+(1/6)*k2);
k4=h*func1(x1+(1/2)*h,x2+(1/8)*k1+(3/8)*k3);
k5=h*func1(x1+h,x2+(1/2)*k1-(3/2)*k3+2*k4);
d1=y1+(k1+4*k4+k5)/6;

k1=h*func2(x1,x2,x3);
k2=h*func2(x2+(1/3)*h,x1+(1/3)*k1);
k3=h*func2(x2+(1/3)*h,x1+(1/6)*k1+(1/6)*k2);
k4=h*func2(x2+(1/2)*h,x1+(1/8)*k1+(3/8)*k3);
k5=h*func2(x2+h,x1+(1/2)*k1-(3/2)*k3+2*k4);
d2=y2+(k1+4*k4+k5)/6;

k1=h*func3(x1,x2,x3);
k2=h*func3(x3+(1/3)*h,x1+(1/3)*k1);
k3=h*func3(x3+(1/3)*h,x1+(1/6)*k1+(1/6)*k2);
k4=h*func3(x3+(1/2)*h,x1+(1/8)*k1+(3/8)*k3);
k5=h*func3(x3+h,x1+(1/2)*k1-(3/2)*k3+2*k4);
d3=y3+(k1+4*k4+k5)/6;

r=(2*k4-3*k3-k5)/10;
if (fabs(r)>tk)
{ h=h/2;}
if (32*(fabs(r)<tk))
{ h=h*2;}

printf("\n x1=%f d1=%f ",(a+x1),d1);
printf("\n x2=%f d2=%f ",(a+x2),d2);
printf("\n x3=%f d3=%f ",(a+x3),d3);
}
getch();
return 0;
}
Craz вне форума Ответить с цитированием
Старый 28.01.2010, 21:36   #2
Craz
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 21
По умолчанию

Заранее СПАСИБО!!!!
Craz вне форума Ответить с цитированием
Старый 28.01.2010, 21:49   #3
Serebro
FORTRAN programmer
Форумчанин
 
Регистрация: 08.12.2009
Сообщений: 153
Плохо

Цитата:
Сообщение от Craz Посмотреть сообщение
Всем Доброе Время Суток!
Я пытаюсь составить алгортм решения системы дифференциальных 3 уравнений. Написал прогу для системы из 2-х уравнений, а теперь патыюсь переделать под 3 уравнения.
Очень прошу помочь мне с этой проблемой, тк завтра сдавать курсач...
Вот моя попытка для 2 уравнений, которую я переделываю для 3 уравнений. Помогите плиз сделать прогу для 3 уравнений...
Очень прошу помочь мне с этой проблемой, тк завтра сдавать курсач...

#include <stdio.h>
#include <conio.h>
#include <math.h>

const double t = 1e-3;
float x1,x2,x3,a,b,t0,tk;
float c1,c2,c3,c4;

double func1 (double x1, double x2, double x3)
{x1=-c2*x1+c1*x2*x3+c1*x1*x2;
return x1;}

double func2 (double x1, double x2, double x3)
{x2=c1*x2+c3*x3-c1*x1*x3;
return x2;}

double func3 (double x1, double x2, double x3)
{x3=-c4*x3+c1*x1*x2;
return x3;}

int main ()
{
float x,y1,y2,y3,k1,k2,k3,k4,k5,r,h,d1,d2 ,d3;
clrscr();
c1=1; c2=3; c3=20; c4=10;
printf("\n x1=");
scanf("%f", &x1);
printf("\n x2=");
scanf("%f", &x2);
printf("\n x3=");
scanf("%f", &x3);
printf("\n t0=");
scanf("%f", &t0);
printf("\n tk=");
scanf("%f", &tk);

cprintf("\n Metod Runge-Kutta-Mersona");
h=tk/20;
y1=x1;
y2=x2;
y3=x3;

for (a=t0; a<=tk+t; a+=h)
{
k1=h*func1(x1,x2,x3);
k2=h*func1(x1+(1/3)*h,x2+(1/3)*k1);
k3=h*func1(x1+(1/3)*h,x2+(1/6)*k1+(1/6)*k2);
k4=h*func1(x1+(1/2)*h,x2+(1/8)*k1+(3/8)*k3);
k5=h*func1(x1+h,x2+(1/2)*k1-(3/2)*k3+2*k4);
d1=y1+(k1+4*k4+k5)/6;

k1=h*func2(x1,x2,x3);
k2=h*func2(x2+(1/3)*h,x1+(1/3)*k1);
k3=h*func2(x2+(1/3)*h,x1+(1/6)*k1+(1/6)*k2);
k4=h*func2(x2+(1/2)*h,x1+(1/8)*k1+(3/8)*k3);
k5=h*func2(x2+h,x1+(1/2)*k1-(3/2)*k3+2*k4);
d2=y2+(k1+4*k4+k5)/6;

k1=h*func3(x1,x2,x3);
k2=h*func3(x3+(1/3)*h,x1+(1/3)*k1);
k3=h*func3(x3+(1/3)*h,x1+(1/6)*k1+(1/6)*k2);
k4=h*func3(x3+(1/2)*h,x1+(1/8)*k1+(3/8)*k3);
k5=h*func3(x3+h,x1+(1/2)*k1-(3/2)*k3+2*k4);
d3=y3+(k1+4*k4+k5)/6;

r=(2*k4-3*k3-k5)/10;
if (fabs(r)>tk)
{ h=h/2;}
if (32*(fabs(r)<tk))
{ h=h*2;}

printf("\n x1=%f d1=%f ",(a+x1),d1);
printf("\n x2=%f d2=%f ",(a+x2),d2);
printf("\n x3=%f d3=%f ",(a+x3),d3);
}
getch();
return 0;
}
Данная программа имеет огромное количество ошибок. Например, цикл некорректно задан, всё время будет считаться одно и тоже выражение.
Serebro вне форума Ответить с цитированием
Старый 28.01.2010, 21:55   #4
Craz
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 21
По умолчанию

Я понимаю, в численных методах я не силён...
Но если Вам не трудно, запишите пожалуйста наиболее правильный с Вашей точки зрения вариант для решения системы из 3-х уравнений!
Заранее СПАСИБО!
Craz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
метод Рунге sneZZZinka Помощь студентам 1 21.12.2009 17:31
Чиленное интегрирование.Метод Рунге sneZZZinka Помощь студентам 0 20.12.2009 19:29
Метод простых итерации для нелинейных уравнений. Подскажите где ошибка DuHbka Помощь студентам 15 31.05.2009 22:46
метод Рунге-Кутта для систем дыф.уравнений 1 порядка Natok Помощь студентам 4 31.05.2009 02:37
Метод итерации для уравнений Hellgrom Паскаль, Turbo Pascal, PascalABC.NET 0 10.05.2009 18:38