Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Офф-топ

Страница: 1 |

 

  Вопрос: Численные методы Добавлено: 17.05.04 19:08  

Автор вопроса:  ViktorZ | ICQ: 271202919 
Помогите понять, как реализовать формулу Симпсона на си. Ну или расскажите кто знает как ее вывести.

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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

 

а вот так сделал

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(a)+f(b)+2*sum1+4*sum2);

 

f()  функция ищет значения функции в точке.

Ответить

Номер ответа: 4
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 23.05.04 00:32
Мне не понравился твой вариант :) Он грубее, менее логичен, да и h=h/2; n=2*n вместо h/=2; n<<=1; тоже плохо :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам