Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу здесь за 20 тыс руб в месяц! alarforum@yandex.ru


Ответ
 
Опции темы
Старый 17.09.2020, 20:47   #1
s10s
Новичок
Джуниор
 
Регистрация: 16.09.2020
Сообщений: 2
По умолчанию Метод Эйлера для обыкновенного дифференциального уравнения первого порядка

Всем привет! Очень прошу помочь.
Есть образец кода для решения задачи Коши методом Эйлера (язык Си), все работает. Значения, как и должно быть, получаются похожими:
Код:
/*n - число точек численного решения,
x - независимая переменная,
y - искомое решение,
f - правая часть,
а - начало интервала,
b - конец интервала,
h - шаг интегрирования*/
#include <math.h>
#include <conio.h>
#define n 100
float f(float, float);
float ya(float);
int main (void)
{
 float a, b, h, x, y[n];
 int k;
 
 a=0; b=1; h=(b-a)/(n-1);
 y[0]=1; // начальное условие
 for (k=1; k<n; k++) // метод Эйлера
 {
 x=k*h;
 y[k]=y[k-1]+h*f(x,y[k-1]);
 }
 
 // сравнение с аналитическим решением
 for (k=0; k<n; k++)
 {
 x=k*h;
 printf("X = %5.2f , numerical = %5.2f, analytical = %5.2f\n",x,y[k],ya(x));
 }
 getch();
}
float f(float x, float y) // правая часть
{
 return 2*(x*x+y); 
 
}
float ya(float x) // аналитическое решение
{
 return 1.5*exp(2*x)-x*x-x-0.5;
Но, подставляя свои значения y'=y/x-log(x)/x; y(a)=1; a=1; b=2; точное решение задачи: y(x)=log(x)+1), что-то идет не так, аналитическое и точное решения очень сильно разнятся (в 500 раз). И преподаватель говорит, что у меня интервал a=1 и b=2, а выдача начинается с 0:
Код:
#include <math.h>
#include <conio.h>
#define n 100
float f(float, float);
float ya(float);
int main (void)
{
 float a, b, h, x, y[n];
 int k;
 a=1; b=2; h=(b-a)/(n-1);
 y[0]=1; // начальное условие y[a]=1
 for (k=1; k<n; k++) // метод Эйлера
 {
 x=k*h;
 y[k]=y[k-1]+h*f(x,y[k-1]);
 }
 // сравнение с аналитическим решением
 for (k=0; k<n; k++)
 {
 x=k*h;
 printf("X = %5.2f , numerical = %5.2f, analytical = %5.2f\n",x,y[k],ya(x));
 }
 getch();
}
float f(float x, float y) // правая часть
{
 return y/x-log(x)/x; 
}
float ya(float x) // аналитическое решение
{
 return log(x)+1;
}
Помогите, пожалуйста! Не могу понять в чем дело. Типы данных пробовал менять. Уравнение вроде верно записано с условий (задание прилагаю).
Изображения
Тип файла: png Снимок.PNG (9.8 Кб, 28 просмотров)
s10s вне форума Ответить с цитированием
Старый 19.10.2020, 07:22   #2
s10s
Новичок
Джуниор
 
Регистрация: 16.09.2020
Сообщений: 2
По умолчанию

Должно быть: x=a+k*h.
Может, кому пригодится.
s10s вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графики решений дифференциального уравнения селя Python 1 21.10.2016 18:25
Решение дифференциального уравнения второго порядка. RaccoonRocket Помощь студентам 3 16.06.2015 22:27
Задача Коши для дифференциального уравнения первого порядка y’= f(x,y) методом Эйлера. Victorials2648 Помощь студентам 1 27.03.2014 18:51
реализовать метод Эйлера и метод Рунге-Кутте 4-ого порядка на языке С++ Janny2014 Помощь студентам 1 27.11.2013 04:23
Решение обыкновенного диференциального уравнения. romchic Помощь студентам 2 17.06.2011 19:10


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя