С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
#1

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

27.01.2011, 11:53. Просмотров 546. Ответов 4
Метки нет (Все метки)

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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 11:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Покритикуйте код финкции нахождения интеграла (C++):

Покритикуйте код - C++
Есть класс Студенты (реализован через односвязный список), хотел бы услышать критику по поводу его улучшения, если кому не лень разбираться...

Покритикуйте код - C++
Покритикуйте код, я точно знаю, что он нубовский но все же. Это моя первая программа на с++ которая делает , что то полезное и типо мой...

Графы. Покритикуйте код - C++
Нужно помощь тех кто работает и пишет хороший и красивый код. У меня построено три матрицы, подскажите как улучшить код. Где можно...

Покритикуйте и помогите улучшить код моей игры - C++
Здравствуйте, недавно начал писать игру и собственно пишу потихоньку, но не в этом суть, просто я только сегодня понял, что мой код может...

Функция нахождения интеграла - C++
Выдает ошибки в чем не так?Что не правильно? #include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; double...

Программа для нахождения определенного интеграла - C++
Помогите, написать программу для нахождения определенного интеграла с точностью Е = 10-3 для заданных границ с помощью трех методов: ...

4
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
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.
И да, хорошо бы для всех формальных параметров функции указывать типы.
1
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.01.2011, 15:52 #3
taras atavin, во-первых, не понял принцип интегрирования. Во-вторых, во второй функции есть сравнение даблов на равенство, что довольно небезопасно.
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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;
}
?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
28.01.2011, 13:13 #5
taras atavin, небезопасность в том, что сравнение может не пройти. Да и машинный эпсилон сам не подставляется, ты должен его явно указать.

У меня, кстати, встречный вопрос: зачем ты программируешь без компилятора?
1
28.01.2011, 13:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2011, 13:13
Привет! Вот еще темы с ответами:

Вычисление интеграла(исправить код) - C++
Добрый вечер! Помогите подправить код. Нужно чтобы точность и пределы интегрирования задавались с клавиатуры , а не были определены. ...

Решение интеграла (необходимо немного изменить код) - C++
есть код, как я думал правильный (он компилируется без ошибок)! Но в итоге выдает решение интеграла равно 0, что я думаю не есть правильно,...

Нахождение интеграла 3 методами (код готов, нужны поправки) - C++
Задано функцию. Написать программу для нахождения определенного интеграла с точность E10-3 для заданных границ (вводятся с клавиатуры) при...

Код нахождения MD5 - C++
Привет всем с помощью openssl пытаюсь получить md5 #include&lt;iostream&gt; #include&lt;openssl\md5.h&gt; #include&lt;windows.h.&gt; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.