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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 19:26   #1
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию Точность в методе симпсона

Вот мой код. Программа считает определенный интеграл методом симпсона.
Как в этот код вставить точность 0.001?

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <windows.h>
char textRus[128];

using namespace std;

float f(float x)
{
return (pow(x,x)*(1+log(x)));
}


int main(int argc, char *argv[])
{


int i,n; float a,b,x,s2,s1,sym,h;//
CharToOem("Ïðèâåò Console!",textRus);
cout<<textRus<<endl;
cout <<"vvedite a ";cin>>a;
cout <<"vvedite b ";cin>>b;
cout <<"vvedite n ";cin >>n;

h=(b-a)/n;

s1=0;
s2=0;

for (i=1;i<=n-1;i++)

{
x=a+i*h;

if (i%2==0)
s1=s1+f(x);
else
s2=s2+f(x);
}
sym=h/3*(f(a)+f(b)+4*s1+2*s2);




cout<<" sym= "<<sym;
system("PAUSE");
return EXIT_SUCCESS;
}
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 20.02.2011, 15:23   #2
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Кто нибудь, АУ?
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 20.02.2011, 15:41   #3
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

используй double переменные
Hemul вне форума Ответить с цитированием
Старый 20.02.2011, 23:05   #4
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Как это? Не понимаю.
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 21.02.2011, 07:28   #5
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Код:
int i,n; 
double a,b,x,s2,s1,sym,h;
Код:
double f(double x)
тип данных double - числа с плавающей точкой,которые обрабатываются с двойной точностью (на float выделяется 4 байта, на double 8)
Hemul вне форума Ответить с цитированием
Старый 21.02.2011, 07:55   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

это не относится к теме вопроса
у float точно и так гораздо выше 0.001
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 21.02.2011, 09:15   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от nikozavr Посмотреть сообщение
Как в этот код вставить точность 0.001?
Так же, как и в практически любую другую задачу итеративных вычислений:

Код:
Полагаем значение_интеграла_на_предыдущем_шаге = 0 ;
[По методу Симпсона] для заданного h вычисляем значение_интеграла_на_следующем_шаге;
while ( | значение_интеграла_на_предыдущем_шаге - значение_интеграла_на_следующем_шаге | > 0.001 ) {
    значение_интеграла_на_предыдущем_шаге = значение_интеграла_на_следующем_шаге ;
    уменьшаем h в два раза ;
    для нового h вычисляем [по методу Симпсона] значение_интеграла_на_следующем_шаге ;
}
Радуемся полученному значению_интеграла_на_следующем_шаге ;

Последний раз редактировалось Vago; 21.02.2011 в 09:48.
Vago вне форума Ответить с цитированием
Старый 21.02.2011, 11:14   #8
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

В методе Симпсона Погрешность контролируется по правилу Рунге.
http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B3%D0%B5
Я делал так:
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
double f(double x)
{
return sqrt(1*pow(x,5));
}


double simpson(double a,double b,int n)
{
  double h;
   h=(b-a)/n;

   double I, I2 = 0, I4 = 0;
   I4 = f(a+h);
   for(int k = 2; k < n; k += 2 )
   {
       I4 += f(a+(k+1)*h);
       I2 += f(a+k*h);
   }
   I = f(a)+f(b)+4*I4+2*I2;
   I *= h/3;

   return I;

}
double integral(double aa,double bb,int n)
{
double locI = 0.0, xi, h;
int j;
h = double((bb - aa) / n);

xi = aa + h / 2;
for (j=0;j<=n;j++)
{
locI = locI + f(xi);
xi = xi + h;
}
locI = locI * h;
return (locI);
}
int main()
{
double a=0,b=0.5, eps=0.001;
double I1,I2;
int n=1;
do{
I1 = integral(a, b, n);
I2 = integral(a, b, n*2);
printf("n = %d integral = %.5lf\n",n, I2);
n++;
}
while (fabs(I1 - I2) > eps);
printf("integral prug= %.5lf\n", I2);
n=1;
do{
I1 = simpson(a, b, n);
I2 = simpson(a, b, n*2);
printf("n = %d integral simpson = %.5lf\n",n, I2);
n++;
}
while (fabs(I1 - I2) > eps);
printf("integral simpson= %.5lf\n", I2);


getch();
return 0;
}
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 21.02.2011, 21:44   #9
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

А как это интегрировать в мой код?
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 24.02.2011, 12:23   #10
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Ну помогите, А?
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Симпсона(си) towelie Помощь студентам 0 23.12.2010 19:36
метод симпсона 13xXx13 Помощь студентам 1 16.12.2010 09:57
ArrayList в методе Stranger333 Общие вопросы по Java, Java SE, Kotlin 1 12.11.2010 08:27
Формула Симпсона Raz0r Помощь студентам 5 22.11.2007 15:50
Точность Sour Помощь студентам 2 31.05.2007 21:08