Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2021, 20:01   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
в Си функцию можно пихать в список вывода
Можно.
Цитата:
Сообщение от digitalis Посмотреть сообщение
Опять у Эйлера шаг 1/99 и 99 шагов
А что такого? Если массив всего на N точек, то между ними N-1 шагов.
Цитата:
Сообщение от digitalis Посмотреть сообщение
А в сравнении х принимает совсем другие значения
Вроде те же.
Цитата:
Сообщение от nexa Посмотреть сообщение
Убрал a из формулы x = a + k * h
Нужно вернуть "a" - в данном условии он равен 0, но в общем случае нет.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 02.02.2021 в 20:03.
BDA вне форума Ответить с цитированием
Старый 02.02.2021, 20:07   #12
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Похоже на правду. Не надо бояться чуть-чуть подрихтовать формат, не сломается. А то функция довольно плавная и мало меняющаяся, и процесс не виден.
%8.6f для всех, кроме x - и в путь!
digitalis вне форума Ответить с цитированием
Старый 02.02.2021, 20:17   #13
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А что такого? Если массив всего на N точек, то между ними N-1 шагов.
С точностью до наоборот Если у нас n шагов, то будет n+1 элементов массива: начало, конец и n-1 промежуточных. Вообще-то не принципиально вроде бы, лишь бы (число шагов * шаг) точно перекрывало интервал интегрирования.
Но тогда и в срвнении нужно брать такую же "некруглую" цифру. На малом числе шагов (скажем, не 100, а 4) это было бы заметно. Но к концу всё бы выравнялось x=b
Впрчем, эти тонкости уже не стоят выеденного гроша ломанного яйца.

Последний раз редактировалось digitalis; 02.02.2021 в 20:19.
digitalis вне форума Ответить с цитированием
Старый 02.02.2021, 20:17   #14
nexa
 
Регистрация: 08.01.2021
Сообщений: 7
По умолчанию

Ребят, спасибо огромное за помощь и быстрые, подробные комментарии
Правда, когда добавил функцию в список вывода, появилась ошибка компиляции, поэтому оставил так)
Вот в итоге что получилось (добавил a в x = a + k*h
Код:
/*
Метод Эйлера для обыкновенного дифференциального уравнения
первого порядка y' = f(x, y).
n - число точке численного решения,
x - независимая переменная,
y - искомое решение,
f - правая часть,
a - начало интервала,
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 = 0.5;
	h = (b-a) / (n-1);
	y[0] = 2/3.0; // начальное условие
	
	// метод Эйлера
	for(k = 1; k < n; k++) { 
		x = a + k * h;
		y[k] = y[k-1] + h*f(x,y[k-1]);
	}
	
	// сравнение с аналитическим решением
	for(k=0; k<n; k++) {
		x= a + 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 x/2.0 - (x*y)/(2*(1-sqrt(x)));
}

// аналитическое решение
float ya(float x) {
	return 1/3.0*(x*x-1) + sqrt(sqrt(1-x*x));
}

Последний раз редактировалось nexa; 02.02.2021 в 20:26.
nexa вне форума Ответить с цитированием
Старый 03.02.2021, 10:48   #15
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Но нормальный формат вывода сделать постеснялся? Пусть будет +- лапоть, мне не жалко.
А функция в списке вывода осталась по-прежнему? Кажется, это первоначальный, неисправленный исходник.
Но мне это - как-то...
digitalis вне форума Ответить с цитированием
Старый 03.02.2021, 18:40   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Про формат согласен, можно было бы и с большей точностью выводить. Про функцию в printf не согласен, и так код должен работать. Если сравнить диффом коды из 1 поста и из 14, то отличия все же есть, правда не все правильные. Во-первых, раз комментарии в коде тоже исправляются, то в 4 строке нужно поправить "число точке". Во-вторых, в функцию f закралась ошибка - теперь она отличается от той, что на картинке в 1 посте.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.02.2021, 22:20   #17
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
функцию в printf не согласен, и так код должен работать.
.......
Во-вторых, в функцию f закралась ошибка - теперь она отличается от той, что на картинке в 1 посте.
1. Может быть, я уже давно не "сишкин", у меня его даже на компе нет. Я же и предупреждал, что не уверен.
2. А насчёт y1 - там у него вместо квадрата - корень действительно. Если бы это Паскаль, можно было бы смешную функцию Sqr зафуфырить туда.

Последний раз редактировалось digitalis; 03.02.2021 в 22:23.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите понять ошибку и исправить kola7007 Python 2 29.10.2017 18:31
Помогите понять ошибку и исправить kola7007 Общие вопросы по Java, Java SE, Kotlin 2 23.09.2017 12:36
Помогите разобраться в коде не погу понять где ошибка wagonwils Общие вопросы C/C++ 0 23.12.2009 21:02
Помогите понять что вызывает ошибку - C liora Общие вопросы C/C++ 1 29.03.2009 22:05