0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
1

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

09.03.2015, 16:31. Показов 3841. Ответов 9
Метки нет (Все метки)

Здравствуйте, прошу помощи, т.к. в программировании я не силен... Имеется полу написанная программа, которая выдает ошибку. Нужно использовать метод Эйлера для написания данной программы. Т.е. задачу решить методом Эйлера (задача ниже) .


Задача такова, что нужно решить уравнение https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{dy}{dx}=f(x,y)

А именно: https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{dy}{dx}={y}_{2}*sin(y) , https://www.cyberforum.ru/cgi-bin/latex.cgi?0<x<20 , https://www.cyberforum.ru/cgi-bin/latex.cgi?y(0)=1

Определить y(x) (в виде таблицы) в указанном интервале с указанными начальными условиями (написать программу)
Погрешность расчета не более 0.001


И вот тут с погрешностью и возникает проблема... Не понимаю что не так, программа уходит в бесконечность, да и работает она как-то не так, как надо...
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
#include <iostream>
#include <math.h>
#include <fstream>
 
double fun1(double);
 
 
using namespace std;
 
int main() 
{
    double y[1000],y1[1000], x1[1000], h, eps0,eps,ex,x;
    int i=0,c,k=0;
    cout<<"eps0 = ";
    cin>>eps0;
    ex=0.1;
    eps=eps0+1;
    do{
    
    c=20/ex;
    ex=ex/10;
    
 
    for (x=0;x<=20;x=20*ex)
    {
        
        
         
        x1[k]=x;
        cout<<x1[k]<<endl;
        k++;
    }
    y[0]=y1[0]=1;
    for (i=0;i<=k, eps0<=eps;i++)
    
    
    
        h=x1[i+1]-x1[i];
        y[i+1]=y[i]+h*fun1(y[i]);
        h=h/2;
        y1[i+1]=y[i]+h*fun1(y1[i]);
        eps=fabs(y[i+1]-y1[i+1]);
    }while (eps0<eps);
    
    for(i=0;i<=k;i++)
    cout << y1[i] << "x =" << x1[i] << endl;
    
    return 0;
}
 
double fun1(double y)
 
 
{
    return (y,2)*sin(y);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2015, 16:31
Ответы с готовыми решениями:

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

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

Решение дифференциального уравнения методом Эйлера
Написать программу, находящую решение дифференциального уравнения y‘=f(x,y) методом Эйлера на...

Решение дифференциального уравнения методом Эйлера
Написать программу, находящую решение дифференциального уравнения y‘=f(x,y) методом Эйлера на...

9
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
09.03.2015, 16:34 2
C++
1
return (y,2)*sin(y);
qwen1234, Это что?
0
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
09.03.2015, 19:53  [ТС] 3
tnk500, функция https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{dy}{dx}={y}^{2}*sin(y)
Я в самом задании неправильно написал функцию, извиняюсь!

Добавлено через 1 час 34 минуты
Помогите пожалуйста!!!

Добавлено через 1 час 21 минуту
tnk500, там должно было быть
C++
1
return pow(y,2)*sin(y);
Добавлено через 16 секунд
опечатка
0
Модератор
Эксперт С++
12483 / 10036 / 6036
Регистрация: 18.12.2011
Сообщений: 26,855
09.03.2015, 19:56 4
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
#include <iostream>
#include <cmath>
using namespace std;
 
double fun1(double y)
{
    return y*y*sin(y);
}
int main() 
{
    double eps=1e-6; // точность
    int n=100; // начальное разбиение
    double xbegin=0.; 
    double xend=20.;
    double y0=1.;
    double h=(xend-xbegin)/n; // начальный шаг
    double y1_fin,y_fin=y0; // конечные значения на двух последовательных итерациях
    do
    {
        y1_fin=y_fin;
        double y=y0;  // начинаем итерацию и проходим до конца интервала
        for(double x=xbegin;x<xend+0.5*h;x+=h)
            y=y+h*fun1(y);
        y_fin=y; // запоминаем значение на конце
        h/=2.; // уменьшаем шаг
    }while (fabs(y_fin-y1_fin)>eps); // пока на концах не будет разность значениq на двух последовательных итерациях<=eps
    
    cout<<"h min="<<h<<" y_fin="<<y_fin<<endl;
    
    // вывод промежуточных значений
    double y=y0;
    for(double x=xbegin;x<5.01;x+=h)
    {
        y=y+h*fun1(y);
        int d=int(x*100.)%10;
        if( d==0 || d==5 )    // выводить с шагом 0.05
          cout <<x << "\t" << y << endl;
    }
    system("pause");
    return 0;
}
1
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
10.03.2015, 09:05  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
int n=100; // начальное разбиение
почему именно на 100 мы разбиваем?

Добавлено через 7 часов 48 минут
zss,
C++
1
2
3
4
5
6
    for(double x=xbegin;x<5.01;x+=h)
    {
        y=y+h*fun1(y);
        int d=int(x*100.)%10;
        if( d==0 || d==5 )    // выводить с шагом 0.05
          cout <<x << "\t" << y << endl;
почему именно такое условие? Объясните пожалуйста, почему вы делаете только до 5.01? И так же объясните, пожалуйста данные строчки
C++
1
int d=int(x*100.)%10;
,
C++
1
  if( d==0 || d==5 )
Спасибо!
0
Модератор
Эксперт С++
12483 / 10036 / 6036
Регистрация: 18.12.2011
Сообщений: 26,855
10.03.2015, 09:16 6
Цитата Сообщение от qwen1234 Посмотреть сообщение
почему именно на 100
1. Разбиение мельче слишком неточное, не позволяет сделать даже приблизительную оценку,
как следствие - итерационный процесс может разойтись.
2. Чем ближе предварительная оценка h к нужной - тем меньше работы компьютеру.
Цитата Сообщение от qwen1234 Посмотреть сообщение
почему именно такое условие
Я предложил выводить значения с шагом 0.05. т.е. для x у которых во втором знаке после запятой либо 0 либо 5. Можете условие удалить и печатать все значения, но тогда они не поместятся на экране.
Закончил вывод на значении 5.00 потому, что все равно дальше выводится одно и то же
(https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\pi )
1
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
10.03.2015, 10:37  [ТС] 7
zss, А разве вместо h не должна быть величина шага, а не число шагов?
0
Модератор
Эксперт С++
12483 / 10036 / 6036
Регистрация: 18.12.2011
Сообщений: 26,855
10.03.2015, 10:56 8
h- величина шага, n - число шагов.
0
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 97
10.03.2015, 19:35  [ТС] 9
zss, теперь у меня такой вопрос, а как же поступить, если я хочу проверить правильно ли он считает и то ли он мне выдает? Как я понимаю, нужно взять у максимальный и идти обратным шагом. А возможно даже как-то интегрированием, но как это все реализовать? Если вы, конечно поняли меня! Спасибо в заранее!!
0
Модератор
Эксперт С++
12483 / 10036 / 6036
Регистрация: 18.12.2011
Сообщений: 26,855
10.03.2015, 20:03 10
Можете попробовать аналитически проинтегрировать и сравнить решение.
Но, в принципе, то, что решение с шагом h и h/2 отличаются не более, чем на eps
дает уверенность в правильности.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2015, 20:03
Помогаю со студенческими работами здесь

Решение дифференциального уравнения Риккати методом Эйлера
---------------------------------------- Это так сказать задание. Решить дифференциального...

Решение дифференциального уравнения методом Эйлера
Добрый вечер, форумчане. Помогите с решением данной задачи, маткад вижу второй раз в жизни, а...

Решение дифференциального уравнения методом Эйлера
Здравствуйте! Подскажите, пожалуйста, в чем ошибка. Решаю дифференциальное уравнение x'=-x, x(0)=1....

Решение дифференциального уравнения по методу Эйлера
Всем привет,возникла проблем с написанием диффиринциального уравнения по методу Эйлера для задачи...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru