Страница: 1 |
а вот так сделал h=h/2; n=2*n; for(i=0,sum1=0;i<=n/2-1;i++) sum1=f(a+2*i*h); for(i=1,sum2=0;i<=n/2-1;i++) sum1=f(a+(2*i+1)*h); lagrang=h/3(f f() функция ищет значения функции в точке. Страница: 1 |
Вопрос: Численные методы
Добавлено: 17.05.04 19:08
Автор вопроса:
ViktorZ | ICQ: 271202919
Помогите понять, как реализовать формулу Симпсона на си. Ну или расскажите кто знает как ее вывести.
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 22.05.04 00:02
О! Это я сегодня делал!
Примерно так: имеем три точки (x-h;y0), (x;y1), (x+h;y2), где h - шаг интегрирования. Через эти три точки можно провести одну параболу ax^2+bx+c, которая должна быть приближением к настоящей кривой. Площадь фигуры под ней равна определенному интегралу от x-h до x+h ax^2+bx+c по dx. Считаем по ф-ле Ньютона-Лейбница, после преобразований получаем h/3*(6ax^2+6ah+6bx+6c), что равно, как несложно убедиться, h/3*(y0+4y1+y2). Приставим эти фигуры одна к другой, получим примерно такую картинку:
1_4_1___1_4_1___1_4_1
____1_4_1___1_4_1____
что равно 1 4 2 4 2 4 ... 2 4 1.
Это реализуется на Си примерно так:
s=fx(xleft)+fx(xright);
for(i=1;i<n;i++){ // n - число отрезков интегрирования
s+=(i%2?2:4)*fx(xleft+h*i);
}
s*=h/3;
Номер ответа: 2
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 22.05.04 00:02
О! Это я сегодня делал!
Примерно так: имеем три точки (x-h;y0), (x;y1), (x+h;y2), где h - шаг интегрирования. Через эти три точки можно провести одну параболу ax^2+bx+c, которая должна быть приближением к настоящей кривой. Площадь фигуры под ней равна определенному интегралу от x-h до x+h ax^2+bx+c по dx. Считаем по ф-ле Ньютона-Лейбница, после преобразований получаем h/3*(6ax^2+6ah+6bx+6c), что равно, как несложно убедиться, h/3*(y0+4y1+y2). Приставим эти фигуры одна к другой, получим примерно такую картинку:
1_4_1___1_4_1___1_4_1
____1_4_1___1_4_1____
что равно 1 4 2 4 2 4 ... 2 4 1.
Это реализуется на Си примерно так:
s=fx(xleft)+fx(xright);
for(i=1;i<n;i++){ // n - число отрезков интегрирования
s+=(i%2?2:4)*fx(xleft+h*i);
}
s*=h/3;
Номер ответа: 3
Автор ответа: ViktorZ
ICQ: 271202919
Вопросов: 56
Ответов: 837
Профиль | | #3
Добавлено: 22.05.04 20:58
+f(b)+2*sum1+4*sum2);
Номер ответа: 4
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 23.05.04 00:32
Мне не понравился твой вариант
Он грубее, менее логичен, да и h=h/2; n=2*n вместо h/=2; n<<=1; тоже плохо