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

Покритикуйте код финкции нахождения интеграла - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.01.2011, 11:53     Покритикуйте код финкции нахождения интеграла #1
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
typedef double(*tfunc)(double);
double integral(double start, end, func f, double dx)
{
 double left, right, result;
 for (x=start, right=start; right<end; left=right)
 {
  right=left+dx;
  if (right>end)
  {
   right=end;
  }
  result+=(f(left)+f(right))*(right-left)/2;
 }
 return result;
}
double integral(double start, end, func f)
{
 double dx;
 double result, oldresult;
 for (dx=(end-start)/2, oldresult=integral(start,end,f,end-start), result=integral(start,end,f,dx); (dx>0)&&(result!=olddresult); dx/=2.0)
 {
  dy=integral(start, end, f, dx);
 }
 return dy;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 11:53     Покритикуйте код финкции нахождения интеграла
Посмотрите здесь:

C++ Функции для записи данных в отдельный файл txt
C++ Покритикуйте код
C++ Программа для нахождения определенного интеграла
C++ Покритикуйте код
Решение интеграла (необходимо немного изменить код) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.01.2011, 12:23     Покритикуйте код финкции нахождения интеграла #2
Цитата Сообщение от taras atavin Посмотреть сообщение
C
1
typedef double(*tfunc)(double);
Цитата Сообщение от taras atavin Посмотреть сообщение
C
1
func f
Опечатка?
Цитата Сообщение от taras atavin Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double integral(double start, end, func f, double dx)
{
 double left, right, result;
 for (x=start, right=start; right<end; left=right)
 {
 right=left+dx;
 if (right>end)
 {
 right=end;
 }
 result+=(f(left)+f(right))*(right-left)/2;
 }
 return result;
}
При первой итерации цикла будет использоваться неинициализированное значение left.
И да, хорошо бы для всех формальных параметров функции указывать типы.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.01.2011, 15:52     Покритикуйте код финкции нахождения интеграла #3
taras atavin, во-первых, не понял принцип интегрирования. Во-вторых, во второй функции есть сравнение даблов на равенство, что довольно небезопасно.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 05:51  [ТС]     Покритикуйте код финкции нахождения интеграла #4
Трапецией интегрирую. И, конечно, вместо
C++
1
x=
должно быть
C++
1
left=
.

Добавлено через 2 минуты
Цитата Сообщение от volovzi Посмотреть сообщение
Во-вторых, во второй функции есть сравнение даблов на равенство, что довольно небезопасно.
В чём небезопастность? Идея этого сравнения в том, чтоб найти пару значений шага, при которых обе оценки интеграла совпадут с учётом машинного эпсилона.

Добавлено через 1 минуту
Так лучше:
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
typedef double(*tfunc)(double);
double integral(double start, double end, tfunc f, double dx)
{
 double left, right, result;
 for (left=start, right=start; right<end; left=right)
 {
  right=left+dx;
  if (right>end)
  {
   right=end;
  }
  result+=(f(left)+f(right))*(right-left)/2;
 }
 return result;
}
double integral(double start, double end, tfunc f)
{
 double dx;
 double result, oldresult;
 for (dx=(end-start)/2, oldresult=integral(start,end,f,end-start), result=integral(start,end,f,dx); (dx>0)&&(result!=olddresult); dx/=2.0)
 {
  dy=integral(start, end, f, dx);
 }
 return result;
}
?
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
28.01.2011, 13:13     Покритикуйте код финкции нахождения интеграла #5
taras atavin, небезопасность в том, что сравнение может не пройти. Да и машинный эпсилон сам не подставляется, ты должен его явно указать.

У меня, кстати, встречный вопрос: зачем ты программируешь без компилятора?
Yandex
Объявления
28.01.2011, 13:13     Покритикуйте код финкции нахождения интеграла
Ответ Создать тему
Опции темы

Текущее время: 10:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru