Форум программистов, компьютерный форум CyberForum.ru

Ругне-Кутта второго порядка - C++

Восстановить пароль Регистрация
 
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
29.05.2012, 11:34     Ругне-Кутта второго порядка #1
Добрый день.
Помогите решить ДУ, методом Ругне-Кутта второго порядка.
Y'- 2Y/x =
Диапазон: 0, 0..1
y0=0

Дано 2 формулы для решения, скрин в аттаче.

З.Ы. Прошу наверное много, но скоро сессия, а как решить не знаю. Или киньте пож ссылку, где есть код в с++ для этих уравнений.
Миниатюры
Ругне-Кутта второго порядка  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
30.05.2012, 10:32  [ТС]     Ругне-Кутта второго порядка #2
Помогите

Добавлено через 17 часов 17 минут
Может, ктото хоть даст любой рабочий код метода ругне кутта 2-го порядка?
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
30.05.2012, 10:54     Ругне-Кутта второго порядка #3
C++
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream.h>
double a=0.4; //var>=10
//double a=1.0; //var<10
long double func(double x, double y){
long double res;
// res=x+y; //test
// res=a*x*x*x-(2/(y*y)); // 10(0) var nomer 2
// res=(a*x*x-1)/(y*y*y+x*x+0.3); //11(1) var nomer 4
// res=(a/(x*x))-(0.3/x)+(1/(y*y)); //12(2) var nomer 5 ?
// res=(a*x)/(y*y*y)+y; // 13(3) var nomer 8
// res=(0.3*a-x)/(0.3*y); // 14(4) var nomer 1
// res=(a/(y*y))+(0.2/(x*x)); //15(5) var nomer 3 ?
// res=( ( (a*y)/(2*x+0.7) ) +( 3/(y*y) ) );  //16(6) var nomer 9
// res=( ( (a*x+0.3*y)*(1-x*y) )/ (-x-0.2*y)  );  //17(7) var  nomer 0
// res=a/(0.4*y*y+2*x); //18(8) var nomer 7
// res=(-a/(y*y))-((0.4*x)/(0.8+x)); //19(9) var nomer 6
res=2*y/x;
return res;}
int main()
{double *x, *y, h, a,b; int i,count;
cout<<"left side and right side"<<endl;
cin>>a>>b;
cout<<"input h"<<endl;
cin>>h;
count=(b-a)/h;
//cout<<count;
count=count+2;
int tmp;
tmp=(int)count;
x=new double[tmp];
tmp=tmp+2;
y=new double[tmp];
cout<<"input y[0]"<<endl;
cin>>y[0];
x[0]=a;
// Aylera
for (i=1; i<(int)count; i++) x[i]=x[i-1]+h;
for (i=0; i<(int)count; i++){
     y[i+1]=y[i]+h*func(x[i],y[i]);}
cout<<"metod Aylera: "<<endl;
for (i=0; i<(int)count; i++) cout<<y[i]<<endl;
 
//========================================
  //runge-kytta
double *k,*z;
z=new double[tmp];
tmp++;
k=new double[tmp];
z[0]=y[0];
for (i=0; i<int(count); i++){
     k[1]=h*func(x[i],z[i]);
     k[2]=h*func(x[i]+h/2,z[i]+k[1]/2);
     k[3]=h*func(x[i]+h/2,z[i]+k[2]/2);
     k[4]=h*func(x[i]+h,z[i]+k[3]);
     z[i+1]=z[i]+((k[1]+2*k[2]+2*k[3]+k[4])/6);}
cout<<"metod Runge-Kytta: "<<endl;
for (i=0; i<(int)count; i++) cout<<z[i]<<endl;
 
//=========================================
 //metod Adamsa
 double *ny,*dy,*q, *dq, *ddq, *dtq;
 q=new double[tmp];
 ny=new double[tmp];
 dy=new double[tmp];
 dq=new double[tmp];
 ddq=new double[tmp];
 dtq=new double[tmp];
  for (i=0; i<4; i++) q[i]=h*func(x[i], z[i]);
  for (i=0; i<4; i++) ny[i]=z[i];
  for(i=0; i<3; i++){
      dy[i]=z[i+1]-z[i];
      dq[i]=q[i+1]-q[i];}
  for(i=0; i<2; i++){
      ddq[i]=dq[i+1]-dq[i];}
  dtq[2]=ddq[1]-ddq[0];
  dy[3]=q[3]+dq[2]/2+5*ddq[1]/12+3*dtq[0]/8;
  ny[4]=ny[3]+dy[3];
  for (i=3 ;i<(int)count; i++){
      q[i+1]=h*func(x[i+1],ny[i+1]);
      dq[i]=q[i+1]-q[i+0];
      ddq[i-1]=dq[i]-dq[i-1];
      dy[i+1]=q[i+1]+dq[i-1]/2+5*ddq[i-2]/12+3*dtq[i-3]/8;
      ny[i+2]=ny[i+1]+dy[i+1];}
  cout<<"metod Adamsa: "<<endl;
  for (i=0; i<(int)count; i++) cout<<ny[i]<<endl;
delete []k;
delete []z;
delete []q;
delete []ny;
delete []dy;
delete []dq;
delete []ddq;
delete []dtq;
delete []x;
delete []y;
system ("pause");
        return 0;}
//---------------------------------------------------------------------------
метод Эйлера, Рунге-Кутта (возможно четвертого порядка не помню какой это был), метод Адамса.
начальные значения, шаг и.т.д. задаются пользователем
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
30.05.2012, 11:12  [ТС]     Ругне-Кутта второго порядка #4
Спасибо, буду лопатить код.
Yandex
Объявления
30.05.2012, 11:12     Ругне-Кутта второго порядка
Ответ Создать тему
Опции темы

Текущее время: 18:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru