2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Ошибка в методе Рунге-Кутты
Сообщение03.11.2013, 17:31 


22/06/12
417
Здравствуйте! Помогите пожалуйста найти неполадки в программе. Дело в том, что программа должна решать диффуру методом Рунге-Кутты, точнее, заполнять три динамических массива х - переменная, у - искомая функция, z - первая производная функции у. На выходе она заполняет файл данными этих массивов. Но значение у одинаково во всех строках. При проверке оказалось, что коэффициенты k0, k1, k2, k3 на каждом шаге равны нулю! Хотя коэффициенты l0, l1, l2, l3 и шаг h нулю не равны.
Программа вроде-бы прозрачная, но ошибку найти не получается. К слову, подпрограмма метода Рунге-Кутты хорошо работала в другой моей задаче давала верные решения.

Код:
int main (void)
{
   double alf_0, alf_1 = 0.9, alf_2 = 1.05, epsilon = 0.001, x_0 = 0, x_n = 1, z_0 = 0, h, A, B, C;
   short n = 20;
   double *x = new double [n+1];
   double *y = new double [n+1];
   double *z = new double [n+1];
   short i;
   
   h = (x_n - x_0)/ n;
   cout << h<<"\n";
   /*do
   {*/
      alf_0 = (alf_1 + alf_2)/ 2;
      
      Run_Kut (x, y, z, x_0, alf_1, z_0, h, n);
      A = y[n] + 2 * z[n];
         
      for (i = 0; i<n; i++)
         cout << x[i] <<"\t"<< y[i] <<"\t"<< z[i] <<"\n";

       Run_Kut (x, y, z, x_0, alf_0, z_0, h, n);
      C = y[n] + 2 * z[n];

      if ((A * C)> 0) alf_1 = alf_0;
      else alf_2 = alf_0;
   /*}
   while (alf_2 - alf_1 > epsilon);
   
   ofstream out;
    out.open ("D:\\Задача 6_1.txt");*/
   for (i = 0; i<n; i++)
      cout << x[i] <<"\t"<< y[i] <<"\t"<< z[i] <<"\n";
      /*out << x[i] <<"\t"<< y[i] <<"\t"<< z[i] <<"\n";
   out.close();*/
   delete[] x, y, z;
   getch();
   return 0;
}
/**/
void Run_Kut (double *X, double *Y, double *Z, double x_0, double y_0, double z_0, double h, short n)
{
   double k0, k1, k2, k3,   l0, l1, l2, l3;
   int i;
   //начальные условия
   X[0] = x_0; Y[0] = y_0; Z[0] = z_0;
   for (i = 1; i<= n; i++)
   {
      k0 = Fy (Z[i-1], 0, 0);                   l0 = Fz (X[i-1],       Y[i-1],             Z[i-1]);
      k1 = Fy (Z[i-1] + h * l0/ 2, 0, 0);  l1 = Fz (X[i-1] + h/2, Y[i-1] + h * k0/ 2, Z[i-1] + h * l0/ 2);
      k2 = Fy (Z[i-1] + h * l1/ 2, 0, 0);  l2 = Fz (X[i-1] + h/2, Y[i-1] + h * k1/ 2, Z[i-1] + h * l1/ 2);
      k3 = Fy (Z[i-1] + h * l2, 0, 0);      l3 = Fz (X[i-1] + h,   Y[i-1] + h * k2,    Z[i-1] + h * l2);
      // для проверки коэффициентов
      /**/
      cout << k0 <<"   "<< k1 <<"   "<< k2 <<"   "<< k3 <<"\n";
      cout << l0 <<"   "<< l1 <<"   "<< l2 <<"   "<< l3 <<"\n";

      X[i] = X[i-1] + h;
      Y[i] = Y[i-1] + (h/ 6) * (k0 + 2 * k1 + 2 * k2 + k3);
      Z[i] = Z[i-1] + (h/ 6) * (l0 + 2 * l1 + 2 * l2 + l3);
   }
}

double Fz (double xi, double yi, double zi)
{
   return ( -2 * xi * zi + xi * yi + exp(-xi) )/(pow(xi, 2) + 1);
}
double Fy (double xi, double yi, double zi)
{
   return zi;
}


Заранее спасибо!

 Профиль  
                  
 
 Re: Ошибка в методе Рунге-Кутты
Сообщение03.11.2013, 17:42 
Заслуженный участник


11/05/08
32166
Вы просто перепутали порядок аргументов при обращении к функции Fy.

 Профиль  
                  
 
 Re: Ошибка в методе Рунге-Кутты
Сообщение03.11.2013, 17:55 


22/06/12
417
Спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group