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

Алгоритм Рунге-Кутта - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.79
larev01
0 / 0 / 0
Регистрация: 11.07.2010
Сообщений: 39
25.01.2011, 14:41     Алгоритм Рунге-Кутта #1
Добрый день. Столкнулся с проблемой. Необходимо решить уравнение методом Рунге-Кутта четвертого порядка с точностью 0.0001 (для достижения точности использую метод двойного пересчета). Написал программу, но интервалы получаются какими-то подозрительно маленькими. Помогите пожалуйста найти ошибку (если она есть).
Уравнение:
Название: Image172.gif
Просмотров: 1202

Размер: 1.0 Кб

Исходник:
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
#include <iostream>
#include <cmath>
#include <conio.h>
 
inline double f(double x, double y)
{
    return ((6-y*y)*std::cos(x)+2*y);
}
 
void runge_kutta(double h, double* x, double* y, int n)
{
    double k1, k2, k3, k4;
 
    for(int i=1; i<=n; i++)
        x[i] = x[i-1]+h;
 
    for(int i=0; i<n; i++) {
        k1 = f(x[i], y[i]);
        k2 = f(x[i]+h/2, y[i]+(h/2)*k1);
        k3 = f(x[i]+h/2, y[i]+(h/2)*k2);
        k4 = f(x[i]+h, y[i]+h*k3);
        y[i+1] = y[i]+(h/6)*(k1+2*k2+2*k3+k4);
    }
}
 
int main()
{
    double h = 0.5;
    const double precision = 0.0001;
 
    int n;
    double* x;
    double* y;
    while(true) {
        double* x_temp;
        double* y_temp;
        n = (static_cast<int>(1/h)+1)*2;
        x_temp = new double[n+1];
        y_temp = new double[n+1];
        x = new double[n+1];
        y = new double[n+1];
        x_temp[0] = 0;
        y_temp[0] = 0.3;
        x[0] = 0;
        y[0] = 0.3;
        runge_kutta(h, x_temp, y_temp, n);
        runge_kutta(h/2, x, y, n);
 
        bool need_break = false;
        for(int i=1; i<=n; i++)
            if(std::fabs(y_temp[i]-y[i])<precision*15)
                need_break = true;
        if(need_break) {
            delete[] x_temp;
            delete[] y_temp;
            break;
        }
 
        delete[] x_temp;
        delete[] y_temp;
        delete[] x;
        delete[] y;
        h/=2;
    }
 
    std::cout.precision(4);
    for(int i=0; i<=n; i++)
        std::cout << x[i] << '\t' << y[i] << '\n';
 
    delete[] x;
    delete[] y;
 
    _getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2011, 14:41     Алгоритм Рунге-Кутта
Посмотрите здесь:

Метод Рунге-Кутта. C++
метод Рунге-Кутта C++
метод Рунге-Кутта C++
Метод Рунге-Кутта C++
C++ Метод Рунге-Кутта
C++ Рунге-Кутта в С++ (ошибки)
Алгоритм Рунге-Кутта для производной второго порядка C++
Метод Рунге-Кутта C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
25.01.2011, 23:18     Алгоритм Рунге-Кутта #2
larev01, посмотрите этот топик http://www.cyberforum.ru/cpp/thread215898.html, может найдете что-нибудь полезное
Askhat93
Сообщений: n/a
20.03.2014, 12:00     Алгоритм Рунге-Кутта #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
#include <iostream>
#include <math.h>
using namespace std;
float f1(float x, float y, float z)
{
    return z;
}
float f2(float x, float y, float z)
{
    return  2*z+3*y+exp(4*x);
}
 
int main()
{   int i;
    float x, y, z, d, k, k1y,k2y,k3y,k4y, k1z, k2z, k3z, k4z, dy, dz;
    float x0=0;
    float y0=1;
    float z0=0;
    float h=0.1;  i=0;
 
    for(x=x0, y=y0, z=z0; i<=10; x=x+h, y=y+dy, z=z+dz, i++)
 
 
    {
            k1y=h*f1(x,y,z);
            k1z=h*f2(x,y,z);
            k2y=h*f1(x+h/2,y+k1y/2,z+k1z/2);
            k2z=h*f2(x+h/2,y+k1y/2,z+k1z/2);
            k3y=h*f1(x+h/2,y+k2y/2,z+k2z/2);
            k3z=h*f2(x+h/2,y+k2y/2,z+k2z/2);
            k4y=h*f1(x+h,y+k3y,z+k3z);
            k4z=h*f2(x+h,y+k3y,z+k3z);
 
 
            dy=(k1y+2*k2y+2*k3y+k4y)/6;
            dz=(k1z+2*k2z+2*k3z+k4z)/6;
            d=(0.8)*exp(-x)+(0.2)*exp(4*x);
            k=100*(d-y)/y;
    cout<<"y= "<<y<<"d= "<<d<<"K= "<<k<<"\n";
    }
 
 
    return 0;
}
Yandex
Объявления
20.03.2014, 12:00     Алгоритм Рунге-Кутта
Ответ Создать тему
Опции темы

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