Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Mnemonik39
20 / 3 / 2
Регистрация: 06.12.2015
Сообщений: 227
Завершенные тесты: 1
#1

Не работает метод Эйлера

03.01.2017, 14:24. Просмотров 343. Ответов 6
Метки нет (Все метки)

Вроде метод Рунге-Кутты считает правильно, а вот метод Эйлера выдает какую-то ерунду.
Подскажите, что не так сделано методом Эйлера? Всех с Новым годом)
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
// Computational_Mathematics_4.1.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <conio.h>
#include <math.h>
#include <cstdlib>
 
using namespace std;
 
const int amount_iteration = 30;
 
int main()
{
    setlocale(LC_ALL, "rus");
    cout << "Контрольная работа по вычислительной математике" << endl;
    cout << "Студента группы АУЗ-261" << endl;
    cout << "Баринова Филиппа Сергеевича" << endl;
    cout << "Номер зачетной книжки - 1932, вариант заданий №5" << endl;
    cout << "Задание 4.1\n";
    cout << "Найти приближённое решение задачи Коши y = f( x, y), y(x0) = y0 методом Эйлера\n"
        "и методом Рунге-Кутта 4 порядка на заданном отрезке с шагом h= 0.1.\n";
    cout << "Исходное дифф. уравнение - y` + x * y = (x - 1) * e^x * y ^ 2\n";
    cout << "Ф-ия удовлетворяющая решению дифф. уравнения y = x*e^x - x^2\e^x + e^x\n";
    cout << "y(0) = 2\n";
 
    double x = 0;
    double F_xy[amount_iteration-1];
    double h = 0.1;
    F_xy[0] = 2;
    for (int  i = 0; i < amount_iteration; i++)
    {
        x += h;
        F_xy[i + 1] = round(((x - 1) * exp(x) * pow(F_xy[i], 2) - x * F_xy[i]) +
            + x * ((x - 1) * exp(x) * pow(F_xy[i], 2) - x * F_xy[i]) * 10000000)/10000000;      
        cout << "Решение дифф. уравнения методом Эйлера на " << i + 1 << "-й итерации: " << F_xy[i + 1]<< "\n";
        
    }
 
    x = 0;
    F_xy[0] = 2;
    h = 0.1;
 
    for (int i = 0; i < amount_iteration; i++)
    {
        
        double k1 = round(((x - 1) * exp(x) * pow(F_xy[i], 2) - x * F_xy[i] * 10000000)) / 10000000;
 
        double k2 = round(((x - 1) * exp(x + h / 2) * pow((F_xy[i] + (x * k1)) / 2, 2) - (x + h / 2) * (F_xy[i] + (x * k1) / 2) * 10000000)) / 10000000;
        
        double k3 = round(((x - 1) * exp(x + h / 2) * pow((F_xy[i] + (x * k2)) / 2, 2) - (x + h / 2) * (F_xy[i] + (x * k2) / 2) * 10000000)) / 10000000;        
        
        double k4 = round(((x + h) - 1) * exp(x + h) * pow((F_xy[i] * k3), 2) - (x + h) * (F_xy[i] * k3) * 10000000) / 10000000;
 
        double diff_F_xy = (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
 
        F_xy[i + 1] = F_xy[i] - diff_F_xy;
 
        cout << "Решение дифф. уравнения методом Рунге-Кутта на " << i + 1 << "-й итерации: " << F_xy[i + 1] << "\n";
 
        h += 0.1;
    }
    cin.get();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2017, 14:24
Ответы с готовыми решениями:

Описать метод Эйлера и обратный метод Эйлера
Может кто помочь с методом &quot;обратный метод Эйлера(Backward Euler)&quot; как его...

Метод Эйлера, и Метод Лагранжа, в долгу не останусь
1)Метод Эйлера 2)Теорема Лагранжа задания вложены

Метод Эйлера
Пишу программу, и нужно реализовать двойной пересчет, вроде поняла как это...

Явный метод Эйлера для ОДУ
есть код #include&quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include...

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

6
cybeuser
105 / 105 / 73
Регистрация: 18.11.2013
Сообщений: 289
03.01.2017, 14:37 #2
Mnemonik39, может дело в шаге?
0
zss
Модератор
Эксперт С++
7061 / 6606 / 4179
Регистрация: 18.12.2011
Сообщений: 17,405
Завершенные тесты: 1
03.01.2017, 14:45 #3
Цитата Сообщение от Mnemonik39 Посмотреть сообщение
* 10000000)/10000000
Что это за издевательство над компьютером?
A. Действительные числа надо задавать так 1E7
Б. Зачем оно тут совсем.
Метод Эйлера предполагает формулу
y(xn+1)=y(xn) + y'(xn)*step;
0
Mnemonik39
20 / 3 / 2
Регистрация: 06.12.2015
Сообщений: 227
Завершенные тесты: 1
03.01.2017, 14:47  [ТС] #4
Шаг каждый раз увеличивается на 0.1. А что с ним не так?

Добавлено через 1 минуту
это округление просто, нов методе Рунге-Кутты оно срабатывает и с этим округлением... Я пробовал и ставить 10000 допустим... но все равно это не работает
0
cybeuser
105 / 105 / 73
Регистрация: 18.11.2013
Сообщений: 289
03.01.2017, 14:47 #5
Mnemonik39, не, шаг постоянный 0.1, ну поменяйте его на более мелкий и посмотрите, шаг влияет на сходимость
0
Mnemonik39
20 / 3 / 2
Регистрация: 06.12.2015
Сообщений: 227
Завершенные тесты: 1
03.01.2017, 14:56  [ТС] #6
эммм... попробовал не помогло... Какие-то неадекватные сообщения выдает
0
cybeuser
105 / 105 / 73
Регистрация: 18.11.2013
Сообщений: 289
03.01.2017, 15:04 #7
Mnemonik39, не знаю как насчет формулы, но касательно доступа к элементам массива так правильно
C++
1
2
3
4
5
6
7
8
9
10
11
double x = 0;
    double F_xy[amount_iteration];
    double h = 0.1;
    F_xy[0] = 2;
    for (int  i = 0; i < amount_iteration - 1; i++)
    {
        x += h;
        F_xy[i + 1] = round(((x - 1) * exp(x) * pow(F_xy[i], 2) - x * F_xy[i]) + x * ((x - 1) * exp(x) * pow(F_xy[i], 2) - x * F_xy[i]) * 10000000.0)/10000000.0;      
        cout << "Решение дифф. уравнения методом Эйлера на " << i + 1 << "-й итерации: " << F_xy[i + 1]<< "\n";
        
    }
Добавлено через 3 минуты
эти моменты:
C++
1
double F_xy[amount_iteration];
C++
1
for (int  i = 0; i < amount_iteration - 1; i++)
0
03.01.2017, 15:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2017, 15:04

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

Метод Эйлера (решение дифференциального уравнения). Ошибка. Написание программы
Здравствуйте, прошу помощи, т.к. в программировании я не силен... Имеется полу...

Метод Эйлера: численное решение начальных задач для дифференциального уравнения - C++
Численно решить начальные задачи для дифференциального уравнения: (Знак...


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

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

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