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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.72
Alex_NOOB
1 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 3
#1

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

20.11.2013, 12:51. Просмотров 9673. Ответов 0
Метки нет (Все метки)

Здравствуйте! Возникла такая проблема. Для большинства из вас не составит труда её решить, а вот меня, как не сильно разбирающегося в программировании, это затрудняет. Ближе к делу - имеется программа, реализующая простой метод Эйлера. Нужно сделать двойной пересчёт, т.е. решить задачу с шагом 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2013, 12:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод Эйлера для решения Задачи Коши (C++):

Комбинированный метод Эйлера для решения интегралов второго порядка - C++
Три дня штудирую форум но так и не смог найти ответ на свой вопрос.... Нужно реализовать комбинированный метод Эйлера( комбинация явного...

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

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

Описать метод Эйлера и обратный метод Эйлера - C++
Может кто помочь с методом &quot;обратный метод Эйлера(Backward Euler)&quot; как его описать? форлуму знаю, а вот как в самом коде - прямой...

Явный и неявный метод Эйлера решения СОДУ - C++
Требуется помощь в реализации алгоритма решения СОДУ явным и неявным методом Эйлера на С++. Сам алгоритм прописан в учебнике Основы...

Программа для решения систем ОДУ неявный методом Эйлера - C++
Всем доброго времени суток! Очень нужна помощь:

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 12:51
Привет! Вот еще темы с ответами:

Конечно-разностный метод решения краевой задачи (дифференциального уравнения) - C++
Решить краевую задачу конечно-разностным методом, условие в приложенных скриншотах и pdf-файле. Вместо правильного решения выводит...

Явный метод Эйлера для ОДУ - C++
есть код #include&quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;fstream&gt; using namespace std; double const...

Исследовать итерационный метод- метод касательных для решения нелинейных уравнений - C++
прочитал много всего , но сам пример реализовать никак не могу , кто может помогите F(x) = x5+5x+1=0 с...

Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии) - C++
Здравствуйте. Помогите пожалуйста дописать программу. Вот что вымучал, но на сдаче завалили, типо нет вывода корней, не рассмотрены...


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

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

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