Форум программистов, компьютерный форум CyberForum.ru

Нужно экспертное мнение! Что рациональнее!? почему так работают функции?! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Устанавливаю Micosoft Visual C++ для Sp1))) http://www.cyberforum.ru/cpp-beginners/thread296086.html
Устанавливаю Micosoft Visual C++ для Sp1 на Sp3, пойдет ли она на Sp3?? Заранее спасибо!! Расскажите вообще об этой среде разработке плиз))) Я только планирую начать кодить на C++
C++ не могу правильно сделать роботу с файлами Скласти алгоритм і написати програму на алгоритмічній мові Борланд С, обробки двовимірного масиву. Створити інтерфейс користувача у вигляді двох вікон. Оформити обчислення в наступному порядку: 1)створити файл вихідних даних IDSnnn.INP, де nnn-три останні цифри залікової книжки 2)помістити вихідні дані в перше вікно 3)вихідний текст програми записати у файл з імям IDSnnn.CPP 4)результати... http://www.cyberforum.ru/cpp-beginners/thread296072.html
C++ сглаживание вещественного массива
Описать процедуру Smooth3(A, N), выполняющую сглаживание вещественного массива A размера N следующим образом: каждый элемент массива заменяется на его среднее арифметическое с соседними элементами (при вычислении среднего арифметического используются исходные значения соседних элементов). Массив A является входным и выходным параметром. С помощью этой процедуры выполнить пятикратное сглаживание...
Обьясните функцию C++
Обьяните пожалуйста кто сможет строчку где g = rand() / (float) RAND_MAX * groups; int g = peerGroup; while (g == peerGroup) g = rand() / (float) RAND_MAX * groups; int r = g * peersInGroup + (rand() / (float) RAND_MAX * peersInGroup); printf("New packet: %u --> %d\n", peer, r); return r;
C++ Составить программу преобразования натуральных чисел http://www.cyberforum.ru/cpp-beginners/thread296059.html
Помогите пожалуйста решить задачу. Составить программу преобразования натуральных чисел, записанных в римской нумерации, в десятичную систему счисления.
C++ разложение в цепную дробь ладно... подробнее

Показать сообщение отдельно
olleg90
34 / 34 / 6
Регистрация: 06.01.2011
Сообщений: 90

Нужно экспертное мнение! Что рациональнее!? почему так работают функции?! - C++

15.05.2011, 15:40. Просмотров 780. Ответов 17
Метки (Все метки)

Привет всем!
Возникли небольшие непонятки с функциями которые вычисляют интеграл по формуле симпсона.
Дело в том что ф-ция integ_2 которую я взял из книги работает во много раз быстрее чем функция integ которую я написал сам. Но на мой взгляд должно быть наоборот ибо в моей функции площадь ДОвычисляеться , а в той которую я взял из книги она просто вычисляется! помогите разобраться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
#include <iostream>
#include <math.h>
 
using namespace std;
 
typedef double (*fx) (double);//указатель на функцию;
 
/*функции*/
double ff1(double x){ return fabs(x);}//exp (-x*x);
double ff2(double x){ return  x+4;}//ln (1+x*x);
double ff3(double x){ return  4-x;}//2/x*cos (x/2);
 
/*функция ищет точку пересечения функций f1 и f2*/
double FindRoot(double epsilon, fx f1, fx f2, double a, double b) 
{
   double t;
   while (fabs(b-a)>=epsilon) 
   {  t = a+((f2(b)-f1(b))*(b-a))/((f2(b)-f1(b))-(f2(a)-f1(a))); 
      if ((f2(a)-f1(a))*(f2(t)-f1(t))<0) b=t;
       else if ((f2(t)-f1(t))*(f2(b)-f1(b))<0) a=t;
       else return t;
   }
   return t;
}
 
 
/*функция считает интеграл на промижутке от а,b с точностью eps*/
double integ(double eps,fx f, double a, double b)
{
 double x,//координата по оси х
     h=(b-a)/2,//шаг
     s=f(a)+f(b),//общая сумма высот точек для вычисления интеграла
     I2,//интеграл взятый с шагом h
     I1=0,//интеграл взятый с шагом h/2
     curr_sum;//текущая сумма
 do
 {
  I2=I1;//присваиваем I2 знчение I1
  curr_sum=0;//обнуляем текущую сумму
  x=a+h/2;//начальное значение по оси х
  while(x<b)//ссумируем высоты с шагом h
  {
   curr_sum+=f(x);//прибовляем высоту точки
   x+=h;//двигаемся по [a,b] с шагном h.
  }
  h/=2;//шаг уменьшаем в два раза
  s+=2*curr_sum;//довычисляем общую сумму
  I1=(s+curr_sum+curr_sum)*(h/3);//вычисляем интеграл по формуле симпсона
 }
 while((fabs(I2-I1)/15)>eps);//проверка точности вычисления по правилу рунге
 return I1;//возвращаем значение интеграла
}
 
/*функция считает интеграл на промижутке от а,b с точностью eps*/
double integ_2 (double e,fx f, double a, double b)
{
    int n=2;//начальное число разбиений отрезка
    double s1=0,s,h; //s1 - предыдущая площадь, s - текущая площадь, h - шаг
    do 
    { 
         h = (b-a) / n; //выбираем шаг в зависимотси от n
         s = f(a)+f(b); //начяльная площадь 
         for(float i=1; i<=n/2-1; i++) 
         s+=4 * f(a + (2 * i - 1) * h) + 2 * f(a + 2 * i * h); //находим сумму точек
         s+=4 * f(b-h); //по формуле симпсона 
         s*=h/3; //по формуле симпсона 
         if(fabs(s-s1)<e) return s;//возвращаем значение площади
         s1 = s; //текущей площади предыдущую
         n*= 2; //увиличиваем число разбиений вдвое
    } 
    while(true); //бесконечный цикл
}
 
 
 
void main()
{ setlocale(LC_ALL,"Rus");
 double eps=0,roots[3],s=0;
cout<<"Введите точность (от 0 до 1): ";  cin>>eps;
 roots[0]=chord(eps,ff1,ff2,-50,50);
 roots[1]=FindRoot(eps,ff2,ff3,-50,50);
 roots[2]=FindRoot(eps,ff3,ff1,-50,50);
 for(int i=0;i<3;++i) cout<<"Точка пересечения №"<<i+1<<": "<< roots[i]<<endl;
  s=integ_2(eps,ff2,roots[0],roots[1])-integ_2(eps,ff1,roots[0],roots[1])+integ_2(eps,ff3,roots[1],roots[2])-integ_2(eps,ff1,roots[1],roots[2]);
 cout<<"\nПлощадь закрашенной фигуры (S) = "<<s<<endl;
 s=integ(eps,ff2,roots[0],roots[1])-integ(eps,ff1,roots[0],roots[1])+integ(eps,ff3,roots[1],roots[2])-integ(eps,ff1,roots[1],roots[2]);
 cout<<"\nПлощадь закрашенной фигуры (S) = "<<s<<endl;
 system("pause");
}
Добавлено через 34 минуты
помогите пожалуйста
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru