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

Метод Эйлера для решения Задачи Коши - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.72
Alex_NOOB
1 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 3
20.11.2013, 12:51     Метод Эйлера для решения Задачи Коши #1
Здравствуйте! Возникла такая проблема. Для большинства из вас не составит труда её решить, а вот меня, как не сильно разбирающегося в программировании, это затрудняет. Ближе к делу - имеется программа, реализующая простой метод Эйлера. Нужно сделать двойной пересчёт, т.е. решить задачу с шагом h/2 (или, что то же самое, при 2*n). Уменьшать шаг (в 2 раза) до тех пор, пока максимальная разница между вычислениями будет не больше требуемой точности EPS, т.е max|y[2*i]-y[i]|<= EPS. Очень надеюсь на вашу скорую помощь. Спасибо за внимание.

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
#include <iostream>
#include <cmath>
 
using namespace std;
 
// Следующая функция возвращает значение
// точного решения задачи в точке x;
// она пригодится при оценке погрешности
// метода, но при нахождении приближенного
// решения она не используется
double calculate_y(double x)
{
    return exp(x) * sin(x);
}
 
// Следующая функция возвращает значение
// правой части исходной задачи по
// заданным аргументам x и y
 
double calculate_f(double x, double y)
{
   return y + exp(x) * cos(x);
}
 
int main()
{
 
    // Задаем границы отрезка, на котором
    // рассматривается исходная задача
    double a;
    double b;
    double EPS = 0.01;
    cout << "Input a: ";
    cin >> a;
    cout << "Input b: ";
    cin >> b;
 
    // Задаем начальное условие задачи
    double y0;
    cout << "Input y0: ";
    cin >> y0;
 
    // Задаем число точек на отрезке и,
    // соответственно, шаг сетки аргумента
    int n;
    cout << "Input n: ";
    cin >> n;
    const double h = (b - a) / n;  
 
    // Массив x будет хранить сетку аргумента,
    // а массив y - значения приближенного
    // решения в этих точках
    double x[n + 1];
    double y[n + 1];
 
    // Воспользовавшись начальными условиями,
    // определим первые элементы этих массивов
    x[0] = a;
    y[0] = y0;
 
    // метод Эйлера
    for (int i = 1; i <= n; i++)
    {
        x[i] = x[i - 1] + h;
        y[i] = y[i - 1] + h * calculate_f(x[i - 1], y[i - 1]);
    }
    cout.precision(5);
    cout.setf(ios::fixed);
 
    // Выводим 4 столбца: абсцисса, значения
    // точного и приближенного решения в ней
    // и, наконец, погрешность в этой точке
    for (int i = 0; i <= n; i++)
    {
        double error = abs(y[i] - calculate_y(x[i]));
        cout << x[i] << '\t' << calculate_y(x[i]) << '\t'
             << y[i] << '\t' << error << endl;  
             
    }
Добавлено через 12 часов 40 минут
Немножко помучился и в итоге разобрался сам. Об оптимальности кода ничего не скажу, но программа работает. Может кому понадобится:
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
#include <iostream>
#include <cmath>
#define EPS 1E-2
 
using namespace std;
 
double calculate_y(double x)
{
    return exp(x) * sin(x);
}
 
double calculate_f(double x, double y)
{
   return y + exp(x) * cos(x);
}
 
int main()
{
    double t,t2;
    bool isEnd;
 
 do{ 
    isEnd = true;
    double a;
    double b;
    cout << "Input a: ";
    cin >> a;
    cout << "Input b: ";
    cin >> b;
    double y0;
    cout << "Input y0: ";
    cin >> y0;
    int n;
    cout << "Input n: ";
    cin >> n;
    double h = (b - a) / n;  
    double x[n + 1];
    double y[n + 1];
    double y_2[2*(n + 1)];
    x[0] = a;
    y[0] = y0;
    for (int j = 1; j < n; j++)
    {
        cout.precision(7);
        cout.setf(ios::fixed);
        x[j] = x[j - 1] + h;
        y[j] = y[j - 1] + h * calculate_f(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) * calculate_f(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;
     }     
   } while(!isEnd);
    
    cin.ignore();
    cin.get();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2013, 12:51     Метод Эйлера для решения Задачи Коши
Посмотрите здесь:

Решение задачи Коши методом Эйлера и Рунге-Кутты C++
C++ Решения ОДУ, используя уточненный метод Эйлера
Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии) C++
Нужны задачи для их решения C++
Нужны задачи для решения C++
Составить программу для решения математической задачи (для любых допустимых значений углов и сторон) C++
Явный метод Эйлера для ОДУ C++
Программа для решения систем ОДУ неявный методом Эйлера C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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