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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2011, 20:43   #1
smbd2011
Новичок
Джуниор
 
Регистрация: 16.09.2011
Сообщений: 5
По умолчанию Метод Рунге-Кутты

Здравствуйте!

Мне нужно решить систему обыкновенных дифференциальных уравнений с использованием метода рунге-кутты. Фото системы прикреплено в картинке. № 2.2

Код написан согласно всем инструкциям учебника, однако практически сразу в результат выдается "1.#QNAN0". Что это значит? На 0 нигде не делю... Все честно вроде бы.


Код:
#include "stdio.h"
#include "stdlib.h"
double func1 (double x,double y, double t);
double func2 (double x,double y, double t);
double func3 (double x, double v, double t);
double v_ (double v, double x, double y, double t);
double w_ (double w, double x, double y, double t);
double x_ (double f, double x, double y, double t, double v);
double y_ (double f, double x, double y, double t, double w);
int main (void)
{
FILE *g;
int i = 0;
double *x, *y, *w, *v;
double alpha = 0.1, t = 0;
double k1, k2, k3, k4, k5, k6, tmp;
g = fopen("res.dat","w+");
x = (double*)malloc(sizeof(double)*1000 );
y = (double*)malloc(sizeof(double)*1000 );
v = (double*)malloc(sizeof(double)*1000 );
w = (double*)malloc(sizeof(double)*1000 );
x[0] = alpha;
y[0] = alpha*alpha-alpha*alpha*alpha*alpha;
v[0] = w[0] = 0;
while (t<=50)
{
t = t + 0.1;
v[i+1] = v_(v[i], x[i], y[i], t);
fprintf (g,"%lf\n", v[i+1]);
w[i+1] = w_(w[i], x[i], y[i], t);
x[i+1] = x_(x[i], x[i-1], y[i-1], t, v[i-1]);
y[i+1] = y_(y[i], x[i-1], y[i-1], t, w[i-1]);
//x[i+1] = v[i]*t + x[i];
//y[i+1] = w[i]*t + y[i];
fprintf(g," %lf %lf %lf\n", x[i], y[i], t);
i++;

}
free(x);
free(y);
free(v);
free(w);
}

double func1 (double x,double y,double t)
{
double res;
res = 2*x*(2*x*x - 1)*(1+x*x-x*x*x*x - y);
return res;
}

double func2 (double x,double y, double t)
{
double res;
res = (1 + x*x - x*x*x*x -y);
return res;
}

double func3 (double x, double v, double t)
{
double res;
res = v*t + x;
return res;
}

double v_ (double v, double x, double y, double t)
{
double tmp, res, k1, k2, k3, k4, k5, k6;
tmp = func1(x,y, t);
k1 = t*tmp;
tmp = func1(x + t*1/5,y + k1*1/5, t);
k2 = t*tmp;
tmp = func1(x + t*3/10,y + k1*3/40 + k2*9/40, t);
k3 = t*tmp;
tmp = func1(x + t*4/5,y + k1*44/45 - k2*56/15 + k3*32/9, t);
k4 = t*tmp;
tmp = func1(x + t*8/9,y + k1*19372/6561 - k2*25360/2187 + k3*64448/6561 - k4*212/729, t);
k5 = t*tmp;
tmp = func1(x + t,y + k1*9017/3168 - k2*355/33 + k3*46732/5247 + k4*49/176 - k5*5103/18656, t);
k6 = t*tmp;
res = v + k1*35/384 + k3*500/1113 + k4*125/192 - k5*2187/6784 + k6*11/84;
return res;
}

double w_ (double w, double x, double y, double t)
{
double tmp, res, k1, k2, k3, k4, k5, k6;
tmp = func2(x,y,t);
k1 = t*tmp;
tmp = func2(x + t*1/5,y + k1*1/5, t);
k2 = t*tmp;
tmp = func2(x + t*3/10,y + k1*3/40 + k2*9/40, t);
k3 = t*tmp;
tmp = func2(x + t*4/5,y + k1*44/45 - k2*56/15 + k3*32/9, t);
k4 = t*tmp;
tmp = func2(x + t*8/9,y + k1*19372/6561 - k2*25360/2187 + k3*64448/6561 - k4*212/729, t);
k5 = t*tmp;
tmp = func2(x + t,y + k1*9017/3168 - k2*355/33 + k3*46732/5247 + k4*49/176 - k5*5103/18656, t);
k6 = t*tmp;
res = w + k1*35/384 + k3*500/1113 + k4*125/192 - k5*2187/6784 + k6*11/84;
}

double x_ (double f, double x, double y, double t, double v)
{
double tmp, res, k1, k2, k3, k4, k5, k6;
tmp = v_(v, x,y,t);
k1 = t*tmp;
tmp = v_(v, x + t*1/5,y + k1*1/5, t);
k2 = t*tmp;
tmp = v_(v,x + t*3/10,y + k1*3/40 + k2*9/40, t);
k3 = t*tmp;
tmp = v_(v,x + t*4/5,y + k1*44/45 - k2*56/15 + k3*32/9, t);
k4 = t*tmp;
tmp = v_(v,x + t*8/9,y + k1*19372/6561 - k2*25360/2187 + k3*64448/6561 - k4*212/729, t);
k5 = t*tmp;
tmp = v_(v,x + t,y + k1*9017/3168 - k2*355/33 + k3*46732/5247 + k4*49/176 - k5*5103/18656, t);
k6 = t*tmp;
res = f + k1*35/384 + k3*500/1113 + k4*125/192 - k5*2187/6784 + k6*11/84;
return res;
}

double y_ (double f, double x, double y, double t, double w)
{
double tmp, res, k1, k2, k3, k4, k5, k6;
tmp = w_(w, x,y,t);
k1 = t*tmp;

tmp = w_(w, x + t*1/5,y + k1*1/5, t);
k2 = t*tmp;
tmp = w_(w,x + t*3/10,y + k1*3/40 + k2*9/40, t);
k3 = t*tmp;
tmp = w_(w,x + t*4/5,y + k1*44/45 - k2*56/15 + k3*32/9, t);
k4 = t*tmp;
tmp = w_(w,x + t*8/9,y + k1*19372/6561 - k2*25360/2187 + k3*64448/6561 - k4*212/729, t);
k5 = t*tmp;
tmp = w_(w,x + t,y + k1*9017/3168 - k2*355/33 + k3*46732/5247 + k4*49/176 - k5*5103/18656, t);
k6 = t*tmp;
res = f + k1*35/384 + k3*500/1113 + k4*125/192 - k5*2187/6784 + k6*11/84;
return res;
}
Изображения
Тип файла: jpg 130920112277.jpg (49.6 Кб, 129 просмотров)
smbd2011 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Рунге-Кутты smbd2011 Общие вопросы C/C++ 5 16.09.2011 23:14
вычматы, задача Коши для ОДУ, методы Рунге-Кутты TdS Помощь студентам 0 02.01.2011 17:56
Метод Рунге Кутты и Эйлера Nikolai17 Помощь студентам 1 20.05.2010 11:42
Метод Рунге-Кутта (Си) PPPPPP Общие вопросы C/C++ 1 13.04.2010 00:55
метод Рунге sneZZZinka Помощь студентам 1 21.12.2009 17:31