Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
#1

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

25.06.2016, 11:05. Просмотров 711. Ответов 8
Метки нет (Все метки)

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

Решение задачи Коши методом Эйлера и Рунге-Кутты - C++
Доброго времени суток всем:) Писал прогу для решения задачи Коши методом Эйлера и Рунге-Кутты на С++. Вроде бы все реализовал, но при...

Решение диф. уравнения для колебаний методом Рунге—Кутты 4го порядка.(С++) - C++
Ребят помогите пожалуйста решить такое на C++ уравнение x''=(-w^2)*x где w-const там замену нужно сделать что то вроде y=x' и y'=x'' и...

Исправить код в методе рунге кутты 4 порядка ля системы ДУ 1 порядка - C++
Вот код для метода рунге кутты 4 порядка для систему ДУ 1 порядка. Вроде все верно, но ответ не правильный. В чем ошибка. Подскажите...

Метод Рунге-Кутта четвертого порядка - C++
Доброго времени суток. Задание по выч. мату. координаты х рассчитываются просто по шагу, но у присваивается значение начальной точки и не...

Решение задачи Коши методом Рунге-Кутта - C++
Решение задачи Коши методом Рунге-Кутта и сравнить результат с MATLAB не могу найти ошибку, работает практически исправно, только где...

Решение систем дифференциальных уравнений методами Эйлера - C++
Здравствуйте, дорогие программисты и просто любители языка С++! В принципе, моя будущая специальность никак не пересекается с...

8
redseven
53 / 12 / 9
Регистрация: 07.02.2015
Сообщений: 301
25.06.2016, 20:57 #2
Хотелось бы уточнить вопрос:

Значения методов Эйлера-Коши и методом Рунге-Кутта 4-ого порядка должны совпадать,я правильно думаю?
0
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
25.06.2016, 23:50  [ТС] #3
без понятия если честно, сам не понимаю ничего(
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
26.06.2016, 09:56 #4
Цитата Сообщение от redseven Посмотреть сообщение
Значения методов Эйлера-Коши и методом Рунге-Кутта 4-ого порядка должны совпадать,я правильно думаю?
Должны, но не идеально. Приблизительно. Рунге-Кутта ведь намного точнее.
0
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
26.06.2016, 12:18  [ТС] #5
можете хоть как-то сделать?пожалуйста
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
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;
}
0
redseven
53 / 12 / 9
Регистрация: 07.02.2015
Сообщений: 301
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;
}
0
Sacredlife
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 114
28.06.2016, 09:34  [ТС] #8
Blitzor DDD, помоги пожалуйста подставить, а то я совсем не шарю, я не вижу даже где твои уровнения((((((
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
28.06.2016, 10:42 #9
Sacredlife, так ведь постом выше уже скинули решение
0
28.06.2016, 10:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2016, 10:42
Привет! Вот еще темы с ответами:

Решение обычных деференциальных уравнений методами Ейлера, Рунге-Кутта - C++
Доброго времени суток!Сдаю академ разницу в университете и вот по информатике задали: Создать алгоритмическое и програмное обеспечение...

Контроль точности Рунге-Кутта (3 или 4 порядка) или Эйлера. - C++
Вопрос таков, как можно контролировать точность в Рунге-Кутта 3 или Рунге-Кутта 4 порядка. Или в методе Эйлера. Искал в интернете и...

Метод Рунге Кутты для системы уравнений - C++
Добрый день! Столкнулся с проблемой, при решении задачи, а именно : Реализовать решение системы оду с количеством уравнений N,...

Какое условие поставить на выходе из цикла в методе Рунге Кутта 4 порядка для системы ДУ 1 порядка? - C++
Пока имеется вот такой код для решения системы ДУ 1 порядка, если имеется ошибка исправьте пожалуйста, Вопрос: как мне получить ответ, мне...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru