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

Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка - C++

Восстановить пароль Регистрация
 
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
25.06.2016, 11:05     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #1
решить методами эйлера-коши с итерациями и рунге -куты четвертого порядка диф. уравнение
y`+ycosx=e-sinx
X e[0,1], y(0)=1 h=0.1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2016, 11:05     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка
Посмотрите здесь:

C++ Решение систем дифференциальных уравнений методами Эйлера
Решение задачи Коши методом Эйлера и Рунге-Кутты C++
C++ Решение диф. уравнения для колебаний методом Рунге—Кутты 4го порядка.(С++)
Решение обычных деференциальных уравнений методами Ейлера, Рунге-Кутта C++
Контроль точности Рунге-Кутта (3 или 4 порядка) или Эйлера. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
redseven
5 / 5 / 5
Регистрация: 07.02.2015
Сообщений: 187
25.06.2016, 20:57     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #2
Хотелось бы уточнить вопрос:

Значения методов Эйлера-Коши и методом Рунге-Кутта 4-ого порядка должны совпадать,я правильно думаю?
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
25.06.2016, 23:50  [ТС]     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #3
без понятия если честно, сам не понимаю ничего(
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
26.06.2016, 09:56     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #4
Цитата Сообщение от redseven Посмотреть сообщение
Значения методов Эйлера-Коши и методом Рунге-Кутта 4-ого порядка должны совпадать,я правильно думаю?
Должны, но не идеально. Приблизительно. Рунге-Кутта ведь намного точнее.
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
26.06.2016, 12:18  [ТС]     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #5
можете хоть как-то сделать?пожалуйста
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
26.06.2016, 12:48     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #6
Sacredlife, ну я недавно решал триплет Лоренца (грубо говоря, систему из трёх диффуров) методом Эйлера. Вот код, посмотри, очень легко сделать по аналогии. Просто поменяй мои три уравнения, на свои

C++ (Qt)
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
#include <iostream>
#include <cmath>
#include <iomanip>
#include <ctime>
#include <unistd.h>
#include <fstream>
 
using namespace std;
 
unsigned int n;
float L=10,Pr=7,H=20,Ra=140;
float Psi,T01,T02,dPsi,dT01,dT02,A,B,C,P,Eps,Time,step,Pi;
 
void initialize_variables(){
 
    Pi=acos(-1.);
    P=1/(pow(L,2));
     Eps= (pow(L,2))/(pow(H,2));
 
    A=1+Eps;
    B = 4*P*Eps+ 1.0/4.0;
    C= P*A+1.0/4.0;
}
 
void initial_approximation(){
    //Начальные приближения
    Psi=0.01;
    T01=0.01;
    T02=0.01;
 
    Time=500;
    n=500000;
    step=Time/n;  //Шаг
}
 
//передаем ссылку на переменную n, и ссылку на переменную filestr,
//без ссылки, файл открывался бы дважды
void Euler_method(const unsigned int &, ofstream &filestr){
 
    for(unsigned int i=0;i<=n;i++)
    {
           dPsi = Psi + step * (-C * Pr * Psi - Ra*Pr* T01/ pow(Pi,4)/ A);
           dT01=T01 + step * (-(4*T02+1)*Psi-C*T01);
           dT02=T02 + step * (2*T01*Psi-B*T02);
 
           Psi=dPsi;
           T01=dT01;
           T02=dT02;
 
           filestr<<i<<"    "<<setw(16)<<Psi<<setw(16)<<T02<<endl;
    }
}
 
int main( )
{
 
float  startcputime = clock();
initialize_variables();
initial_approximation();
 
 // open text file
    ofstream  filestr;
    filestr.open ("Problem 8. Results.txt", ios_base::out | ios_base::trunc);
     if(filestr == NULL)
         {
             cout << "error! didn't open the file!"<<endl;
             return -1;
         }
     else cout<<"The file has been opened!"<<endl;
 
    Euler_method(n, filestr);
 
filestr.close();
cout << "The file has been closed!"<<endl;
float  finishcputime = clock();
cout<<"done in "<< (finishcputime - startcputime)/(1e+6) <<" seconds "<< endl;
    return 0;
}
redseven
5 / 5 / 5
Регистрация: 07.02.2015
Сообщений: 187
26.06.2016, 16:31     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #7
Вот как пример.

Но насчёт правильности не уверен,считать то считает и точности заданны выводит как и полагается.
Но для этого нужно разобратся в вычислительной математике.
А это процесс не быстрый
Но если поджимает может и поможет.

А так считает и методом Рунге-Кутта и Методом Эйлера с задачей Коши

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
99
100
101
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <cmath>
 
#define EPS 1E-2
 
using namespace std;
 
//Исходное уравнение
double func ( double x,double y )
{
    return exp(x)-sin(x)-y*cos(x);
}
//Функция, реализующая метод Эйлера-Коши
void EulerKoshi (double h,double a,double b)
{   
    const int n = 10;
    const double y0=1;
    double x[n + 1];
    double y[n + 1];
    double t,t2;
    double y_2[2*(n + 1)];
    x[0] = a;
    y[0] = y0;
    for (int j = 1; j < n; j++)
    {
     x[j] = x[j - 1] + h;
     y[j] = y[j - 1] + h * func(x[j - 1], y[j - 1]);
     t = y[j];
     cout <<"-------------------" << endl;
     cout << "x_h= " << x[j-1] + h << endl;
     cout << "y_h= " << t << endl;         
        for (int i = 0; i < 2; i++)
        {
            x[i] = x[i - 1] + h/2;
            y_2[i] = y_2[i - 1] + (h/2) * func(x[i - 1], y_2[i - 1]);
            t2 = y_2[i];
        }
             cout << "y_h2= " << t2 << endl;
             cout <<"eps= " << abs(t2-t) << endl;
             cout <<"-------------------" << endl;
             if(abs(t2-t) > EPS)
             {
             h = h/2;
             }
             cout << "h= " << h << endl;
    }
}
 
 
//Функция, реализующая метод Рунге-Кутта 4-ого порядка
double RungeKut(double h,double a,double b)
{   
     double result,x1=1;
    int i;
    const int n = 10;
    double x =a;
    double y=1;
    double y1;
    double k1;
    double k2;
    double k3;
 
    h = (x1-x)/n;
    y1 = y;
    i = 1;
    do
    {
        k1 = h*func(x, y);
        x = x+h/2;
        y = y1+k1/2;
        k2 = func(x, y)*h;
        y = y1+k2/2;
        k3 = func(x, y)*h;
        x = x+h/2;
        y = y1+k3;
        y = y1+(k1+2*k2+2*k3+func(x, y)*h)/6;
        y1 = y;
        i = i+1;
    }
    while(i<=n);
    result = y;
    return result;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    const int a=0;
    const int b=1;
    const double h = 0.1;
    cout<<"Программ для решения диф.уравения y'+y*cosx=e - sinx:"<<endl;
    cout<<"Решение диф.уравнения методом Эйлера-Коши"<<endl;
    EulerKoshi(h,a,b);
    cout<<"Решение диф.уравнения методом Рунге-Кутта 4-ого порядка"<<endl;
    cout<<RungeKut(h,a,b)<<endl;
    system("pause");
    return 0;
}
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
28.06.2016, 09:34  [ТС]     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #8
Blitzor DDD, помоги пожалуйста подставить, а то я совсем не шарю, я не вижу даже где твои уровнения((((((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2016, 10:42     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка
Еще ссылки по теме:

C++ Решение задачи Коши методом Рунге-Кутта
C++ Метод Рунге-Кутта четвертого порядка
Исправить код в методе рунге кутты 4 порядка ля системы ДУ 1 порядка C++

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

Или воспользуйтесь поиском по форуму:
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
28.06.2016, 10:42     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка #9
Sacredlife, так ведь постом выше уже скинули решение
Yandex
Объявления
28.06.2016, 10:42     Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка
Ответ Создать тему
Опции темы

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