powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рбята выручайте
5 сообщений из 5, страница 1 из 1
Рбята выручайте
    #34445657
gbcfk(f)^
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток!
Не знаю куда запостить, тут вроде бы самое подходящее место..
Значит так, задача: написать на с++ программу, которая решала бы систему обыкновенных дифференциальных уравнений методом Рунге Кутта . Казалось бы чего проще, ан нет, что-то у меня не получатся :(
Набросал такую штуку, которая решает (в качестве примера задачу хищник-жертва с начальными условиями х(0)=0, у(0)=0)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#include<iostream.h> #include<iomanip.h> #include<conio.h>
double f1(double x1, double x2){return  0 . 1 *x1- 0 . 01 *x1*x2;}
double f2(double x1, double x2){return  0 . 01 *x1*x2- 0 . 1 *x2;}
main(){
  double mas[ 10001 ][ 2 ];  double p11,p12,p13,p14,p21,p22,p23,p24,p31,p32,p33,p34,p41,p42,p43,p44,h,i;
  int k,d,j;
  FILE *g= fopen("D:\\111.txt", "w");
  mas[ 0 ][ 0 ]= 3 ;                         - начальные условия
  mas[ 0 ][ 1 ]= 3 ;                         - начальные условия
  h= 0 . 001 ;                               - шаг
  fputs("{{", g);
  fprintf(g,"%.8f",mas[ 0 ][ 0 ]);
  fputs(",", g);
  fprintf(g,"%.8f",mas[ 0 ][ 1 ]);
  fputs("}", g);
  for(k= 0 ;k< 2000 ;k++) {
  p11=h*f1(mas[k][ 0 ],mas[k][ 1 ]);
  p12=h*f2(mas[k][ 0 ],mas[k][ 1 ]);
  p21=h*f1(mas[k][ 0 ]+ 0 . 5 *p11,mas[k][ 0 ]+ 0 . 5 *p12);
  p22=h*f2(mas[k][ 0 ]+ 0 . 5 *p11,mas[k][ 0 ]+ 0 . 5 *p12);
  p31=h*f1(mas[k][ 0 ]+ 0 . 5 *p21,mas[k][ 0 ]+ 0 . 5 *p22);
  p32=h*f2(mas[k][ 0 ]+ 0 . 5 *p21,mas[k][ 0 ]+ 0 . 5 *p22);
  p41=h*f1(mas[k][ 0 ]+ 0 . 5 *p31,mas[k][ 0 ]+ 0 . 5 *p32);
  p42=h*f2(mas[k][ 0 ]+ 0 . 5 *p31,mas[k][ 0 ]+ 0 . 5 *p32);
  mas[k+ 1 ][ 0 ]=mas[k][ 0 ]+( 1 ./ 6 )*(p11+ 2 *p21+ 2 *p31+p41);
  mas[k+ 1 ][ 1 ]=mas[k][ 1 ]+( 1 ./ 6 )*(p12+ 2 *p22+ 2 *p32+p42);

  if(k% 1000 == 0 ){                      - вывод результата в файл
  fputs(",{", g);
  fprintf(g,"%.8f",mas[k][ 0 ]);
  fputs(",", g);
  fprintf(g,"%.8f",mas[k][ 1 ]);
  fputs("}", g);   }                    - вывод результата в файл
  }
  cout <<"\n"<<"Interval: [0;"<<i*h- 1 <<"]";
  fputs("};", g);
  fclose(g);
  Sleep( 100000 );
 }
Проверяю правильность решения пакетом Mathematica и выясняется, что моя программа врет. Я в недоумении, вроде все формулы правильны, а решение в минуса уходит - такого не может быть :(
Уже голову сломал, пытаясь найти ошибку. Помогите пожалуйста
...
Рейтинг: 0 / 0
Рбята выручайте
    #34445672
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже не помню этого (20 лет прошло) Только вот сдается что округляться надо, полволка не жилец, как и ползайца
C++
...
Рейтинг: 0 / 0
Рбята выручайте
    #34445905
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbcfk(f)^...Проверяю правильность решения пакетом Mathematica и выясняется, что моя программа врет. Я в недоумении, вроде все формулы правильны, а решение в минуса уходит - такого не может быть :( Уже голову сломал, пытаясь найти ошибку. Помогите пожалуйста

Ну ты даёшь чел! Этож форум по С++ а не математики. Дай бог вспомнить, что такое Рунге-Кутт..

Ну ладно.. попробуем посмотреть. Ты говоришь, что твои решения уходят в минуса. Так? И говоришь, что пакет Matematica даёт якобы верное решение. Тогда разбей эту задачу на части. Потрассируй промежуточные переменные. Найди то слагаемое, которое тянет ответ в минуса.
Если Matematica позволяет трассировать промежуточный результат - воспользуйся этим.

С переменными p11..p44 - какие-то непонятки. Похоже, ты пытался иммитировать матрицу и где-то протупил с порядком интексов коэффициентов. Проверь еще раз.

Найди в готовый исходник Рунге-Кутта и сравни со своей реализацией. Найдешь много косяков ИМХО.
...
Рейтинг: 0 / 0
Рбята выручайте
    #34446123
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Личное пожелание - если поставить более читаемые имена переменных и нормально организовать матрицу 2D массивом, есть хороший шанс, что отловится парочка глюков...
...
Рейтинг: 0 / 0
Рбята выручайте
    #34446204
gbcfk(f)^
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все! Всем спасибо! Ваши пожелания сподвигли меня на дотошную проверку значений переменных на каждом шаге... с листочком и ручкой :) Как и следовало ожидать, была найдена ошибка в индексе массива, которая и приводила к неверному результату
Если кому-нибудь интересно :) , привожу правильно работающую програмку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
#include<iostream.h> #include<iomanip.h> #include<conio.h>
double f1(double x1, double x2){return  0 . 1 *x1- 0 . 01 *x1*x2;}
double f2(double x1, double x2){return  0 . 01 *x1*x2- 0 . 1 *x2;}
main(){
double mas[ 10001 ][ 2 ];  double p11,p12,p13,p14,p21,p22,p23,p24,p31,p32,p33,p34,p41,p42,p43,p44,h,i;
  int k,d,j;
  FILE *g= fopen("D:\\111.txt", "w");
  mas[ 0 ][ 0 ]= 3 ;                      - начальные условия
  mas[ 0 ][ 1 ]= 3 ;                      - начальные условия
  h= 0 . 1 ;                               - шаг
  fputs("{{", g);
  fprintf(g,"%.8f",mas[ 0 ][ 0 ]);
  fputs(",", g);
  fprintf(g,"%.8f",mas[ 0 ][ 1 ]);
  fputs("}", g);
  for(k= 0 ;k< 760 ;k++) {
  p11=h*f1(mas[k][ 0 ],mas[k][ 1 ]);
  p12=h*f2(mas[k][ 0 ],mas[k][ 1 ]);
  p21=h*f1(mas[k][ 0 ]+ 0 . 5 *p11,mas[k][ 1 ]+ 0 . 5 *p12);
  p22=h*f2(mas[k][ 0 ]+ 0 . 5 *p11,mas[k][ 1 ]+ 0 . 5 *p12);
  p31=h*f1(mas[k][ 0 ]+ 0 . 5 *p21,mas[k][ 1 ]+ 0 . 5 *p22);
  p32=h*f2(mas[k][ 0 ]+ 0 . 5 *p21,mas[k][ 1 ]+ 0 . 5 *p22);
  p41=h*f1(mas[k][ 0 ]+p31,mas[k][ 1 ]+p32);
  p42=h*f2(mas[k][ 0 ]+p31,mas[k][ 1 ]+p32);
  mas[k+ 1 ][ 0 ]=mas[k][ 0 ]+( 1 ./ 6 )*(p11+ 2 *p21+ 2 *p31+p41);
  mas[k+ 1 ][ 1 ]=mas[k][ 1 ]+( 1 ./ 6 )*(p12+ 2 *p22+ 2 *p32+p42);

  if(k% 10 == 0 ){                      - вывод результата в файл
  fputs(",{", g);
  fprintf(g,"%.8f",mas[k][ 0 ]);
  fputs(",", g);
  fprintf(g,"%.8f",mas[k][ 1 ]);
  fputs("}", g);   }                    - вывод результата в файл
  }
  fputs("};", g);
  fclose(g);
  Sleep( 100000 );  }
Вдруг кому-то пригодится в будущем :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рбята выручайте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]