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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2019, 15:08   #1
3north6
Новичок
Джуниор
 
Регистрация: 18.10.2019
Сообщений: 3
По умолчанию Использование функций с++

Разработать программу для вычисления интеграла с заданной точностью методом прямоугольников и методом трапеций, оформив каждый способ в виде отдельной функции. Вывести на экран результаты интегрирования разными методами для сравнения. Подынтегральное выражение оформить в виде отдельной функции.
Изображения
Тип файла: png Снимок.PNG (966 байт, 53 просмотров)
3north6 вне форума Ответить с цитированием
Старый 19.10.2019, 16:50   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Разрешите выполнять ?
- Поручик, а деньги ?
- Гусары с дам денег не берут !
digitalis вне форума Ответить с цитированием
Старый 19.10.2019, 18:56   #3
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Код:
#include <iostream>
#include <cmath>
using namespace std;

double fun(double x)
{    
    return (log10(x)/sqrt(x+1));
}

void TrapezeIntegral()//метод трапеций
{
    double a=1.0, b=5.0, h, x, S = 0, eps=1e-4, fa, fb, f;
    int i, n=1000;
    
    x = a;
    h = (b - a) / n;
    fa = fun(a);
    fb = fun(b);
    f = h * (fa + fb) / 2.0;
    for (i = 1; i < n; i++)
    {
        x = a + i * h;
        f += h * fun(x);
    }
    cout << "Trap Integral = " << f << endl;
}
 
void RectangleIntegral()//вычисление интеграла методом прямоугольников
{
    double a = 1.0, b = 5.0, h, x, S = 0, eps = 1e-4, f=0;
    int i, n = 1000;
 
    x = a;
    h = (b - a) / n;
    for (i = 0; i <= n; i++)
    {
        x = a + (i - 0.5)*h;
        f +=  h * fun(x);
    }
    cout<<"\nRect Integral = " << f << endl;
}
int main()
{
    TrapezeIntegral();
    RectangleIntegral();
    system("pause");
    return 0;
}
http://cpp.sh/8sj3
Не знаю как там точность наладить. Может быть кто-нибудь допилит?
Из-за этого не используются переменные S и eps - Эпсилон, точность, вот она-то нам и нужна. Но как ее применить?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 19.10.2019 в 19:42.
Cuprum5 вне форума Ответить с цитированием
Старый 19.10.2019, 20:41   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Удваивать число точек разбиения. Если результат, полученный на i+1-й итерации отличается по абс. величине от полученного на i-й меньше, чем на eps - точнось досигнута. А S нужен для того, чтобы не просто выводить полученное значение, а сохранять его для сравнения с предыдущим. Поэтому нужна функция, а не void.
Ну и сумматор f перед циклом в RectangleIntegral кто-то должен обнулить.
Как-то так.
digitalis вне форума Ответить с цитированием
Старый 19.10.2019, 20:44   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

f там обнуляется.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 19.10.2019, 21:08   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
f там обнуляется.
Может быть. Но не уверен. Как компилятор устроен. Я стандарт языка С++ давно (никогда) не читал. Локальные переменные подпрограммы если обнуляются при каждом обращении, тогда да. Но я бы не надеялся на компилятор. Оператор f = 0; будет всегда выполняться единообразно - на любой платформе, при любой версии компилятора.

Последний раз редактировалось digitalis; 19.10.2019 в 21:17.
digitalis вне форума Ответить с цитированием
Старый 20.10.2019, 06:42   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Причем тут стандарт. Локальные переменные не обнуляются, естественно. НО там написано:
Код:
f=0;
p51x вне форума Ответить с цитированием
Старый 20.10.2019, 09:04   #8
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Код:
for(i = 0; i <= n; i++)
- не совсем понимаю вот этот код в RectangleIntegral. Кто-нибудь может объяснить почему i до n включительно - так же ведь получается лишний правый прямоугольник. Если попробовать i < n, то возникает расхождение по результату по сравнению с методом трапеций.
Это вообще метод серединных прямоугольников? Код RectangleIntegral правильный?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 20.10.2019, 10:07   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Причем тут стандарт. Локальные переменные не обнуляются, естественно. НО там написано:
Код:
f=0;
Стандарт определяет получаемый результат - независимо от реализации компилятора. Точнее, компилятор обязан выполнить требование стандарта.
Код:
    double a = 1.0, b = 5.0, h, x, S = 0, eps = 1e-4, f=0;
Здесь объявление локальных переменных с инициализацией некоторых, которая (см. выше) не обязана выполняться. Оператора присваивания f=0 нет. Так что вопрос остался открытым.
Cuprum5 конечно, код неправильный. <n .
Код:
        x = a + (i - 0.5)*h;
Тут вообще для i=0 аргумент вне границ интервала.
И вообще обычно делают так:
x = a + 0.5 * h до начала цикла
................................... .................
x += h в цикле. И никакие умножения не нужны.
digitalis вне форума Ответить с цитированием
Старый 20.10.2019, 10:56   #10
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Вот, опробуем новую функцию
Код:
void RectangleIntegralNew()//вычисление интеграла методом правых прямоугольников
{
    double a = 1.0, b = 5.0, h, x, f=0;
    int i, n = 1000;

    h = (b - a) / n;
    for(i = 1; i <= n; i++)
    {
        x = a + i*h;
        f += fun(x);
    }
    f *= h;
    cout << "\nRect Integral New = " << f << endl;
}
Результат на картинке.
Проверяйте. Результат, как видно, отличается от метода трапеций.
Изображения
Тип файла: png 1.png (10.4 Кб, 25 просмотров)
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
использование функций в С++ mihav Общие вопросы C/C++ 9 08.03.2013 12:46
Использование функций C в VB All_Ex Обсуждение статей 0 13.06.2012 13:49
Использование функций С++ ignat129 Помощь студентам 5 13.05.2012 16:15
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25
Использование функций prikolist Общие вопросы C/C++ 15 06.04.2009 18:42