Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/64: Рейтинг темы: голосов - 64, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 13

Численное интегрирование

05.09.2012, 11:50. Показов 12440. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые программеры!

С языком СИ я лично познакомился только сегодня, и поэтому понимаю пока не очень хорошо )

есть выражение

https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\int \limits_a^b f(x) \, dx

нужна ваша помощь в написании программы в VisialStudio (ver. от 6 до 10)

решить это уравнение и построить график

честно говоря сам без понятия как это делать, вот сижу читаю умные книжки по СИ. Пока читаю о вводе переменных =)

если не очень заняты и можете помочь, буду вам очень признателен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.09.2012, 11:50
Ответы с готовыми решениями:

Численное интегрирование, формула прямоугольников
Здравствуйте. Проблема. Не срабатывает условие в цикле в функции Integral. Цикл получается бесконечный...Не могу понять почему. e - это у...

Численное интегрирование методом Симпсона (перевод с Basic на C)
задача: для заданной ф-ии и границ интегрирования задать численное интегрирование методом Симпсона с уменьшением в 2 раза шага...

Интегрирование по частям
Нужно вычислить интеграл E(k)=x^k * e^(1-x) dx, k вводим с клавиатуры. Проблем в томчто не численным методом, а про по частям. С точностью...

30
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.09.2012, 19:00
Студворк — интернет-сервис помощи студентам
easybudda, у тебя немного не то (хотя считает правильно).

Допустим, нужно найти интеграл функции https://www.cyberforum.ru/cgi-bin/latex.cgi?\operatorname{f} (x) на отрезке https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\[a, \, b\right\] с неравномерным шагом (наша задача). Выберем первоначальный шаг https://www.cyberforum.ru/cgi-bin/latex.cgi?h и рассчитаем приближенное значение интеграла на участке https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\[a, \, a + h\right\] (В нашем случае это https://www.cyberforum.ru/cgi-bin/latex.cgi?Q = h \cdot \frac{\operatorname{f}(a) + \operatorname{f}(a + h)}{2}). После чего оцениваем ошибку (я использовал для оценки метод Рунге). Если ошибка слишком велика, то мы уменьшаем шаг вдвое и вычисляем приближенное значение интеграла уже на участке https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\[a, \, a + \frac{h}{2}\right\], и так далее до тех пор, пока ошибка не станет допустимой. В этом случае мы прибавляем вычисленное значение интеграла на отрезке к переменной-аккумулятору (result), после чего проверяем, достаточно ли мало значение ошибки, полученное при последней операции интегрирования, и в этом случае мы можем увеличить шаг. Затем мы переходим к следующему участку нашего первоначального отрезка https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\[a, \, b\right\] и так до тех пор, пока мы не пройдем весь отрезок.

Идея состоит в том, что в зависимости от функции и от пределов интегрирования может случиться так, что наша функция будет иметь как участки, где она будет очень резко возрастать/убывать, так и участки, где она почти не будет меняться. При этом с одной стороны нам нужно брать очень маленький шаг, чтобы на участках первого типа у нас не получилось больших ошибок, а с другой стороны на участках второго типа тратится слишком большое число шагов. Неравномерный шаг же позволяет резко сократить объем вычислений, сохраняя необходимую точность.

Я переделал свой быдлокод (переписал на С, убрал ненужные участки, использовал "говорящие" идентификаторы), должно теперь читаться получше:

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
#ifndef NDEBUG
#define DEBUG(EXPR, ...)                        \
    fprintf(stderr, EXPR "\n", __VA_ARGS__)     
#else
#define DEBUG(EXPR, ...) ((void) 0)
#endif
 
double square(double x)
{
    return x * x;
}
 
#define FUNCTION_TABLE                          \
    DEF_FUNC(sin, "sin x")                      \
    DEF_FUNC(cos, "cos x")                      \
    DEF_FUNC(tan, "tan x")                      \
    DEF_FUNC(exp, "e^x")                        \
    DEF_FUNC(square, "x^2")                     
 
typedef double (*FUNC)(double);
 
#define DEF_FUNC(fun, name) fun,
static FUNC functions[] = 
{
    FUNCTION_TABLE
};
#undef DEF_FUNC
 
#define DEF_FUNC(fun, name) name,
static const char *names[] =
{
    FUNCTION_TABLE
};
#undef DEF_FUNC
 
#define EPS 5e-4
#define FUNCTIONS_COUNT (sizeof functions / sizeof *functions)
#define INITIAL_STEP 1e-2
#define STEP_TOLERANCE 10
#define THETA 0.333             /* For trapezoid */
 
double trapezoid(FUNC func, double x, double step)
{
    return (func(x) + func(x + step)) * step / 2.0;
}
 
double runge_estimation(double i2, double i)
{
    return THETA * fabs(i2 - i);
}
 
enum action
{
    INCREASE, DECREASE
};
 
void adjust_step(double *current_step, enum action action)
{
    *current_step *= action == DECREASE ? .5 : 2;
}
 
double integrate(FUNC func, double a, double b)
{
    double result = 0;
    double step = INITIAL_STEP, step_2;
    double x = a;
    
    size_t num_steps = 0;
    
    while(x < b)
    {
        if(x + step > b)
            step = b - x;
 
        step_2 = step / 2;
        
        double integr = trapezoid(func, x, step);
        double integr_2 = trapezoid(func, x, step_2) +
            trapezoid(func, x + step_2, step_2);
 
        double error_estimation = runge_estimation(integr, integr_2);
        double acceptable_error = step * EPS / (b - a);
        
        if(acceptable_error < error_estimation) /* Step is too large */
            adjust_step(&step, DECREASE);
        else
        {
            result += integr_2;
            x += step;
            ++num_steps;
 
            /* Step is too small */
            if(acceptable_error >= STEP_TOLERANCE * error_estimation)
                adjust_step(&step, INCREASE);
        }
    }
 
    DEBUG("Integral = %.3f (%zu steps)", result, num_steps);
    
    return result;
}
 
int menu(void)
{
    size_t i;
    size_t num;
    
    puts("Select a function to integrate");
    
    for(i = 0; i < FUNCTIONS_COUNT; ++i)
        printf("% 4d> %s\n", (int) i + 1, names[i]);
    puts("or enter 0 to exit");
 
    printf("\n>>> ");
    fflush(stdout);
 
    if(scanf("%zu", &num) != 1)
        return -1;
 
    return num;
}
 
int main(void)
{
    int choice = menu();
 
    if(choice == -1)
    {
        fputs("Incorrect input\n", stderr);
        exit(1);
    }
 
    if(choice > (int) FUNCTIONS_COUNT)
    {
        fprintf(stderr, "Your choice must be in the range [0, %zu]\n", FUNCTIONS_COUNT);
        exit(1);
    }
 
    if(choice != 0)
    {
        double a, b;
 
        fputs("Left bound: ", stdout);
        fflush(stdout);
        scanf("%lf", &a);
 
        fputs("Right bound: ", stdout);
        fflush(stdout);
        scanf("%lf", &b);
                
        double result = integrate(functions[choice - 1], a, b);
 
        printf("Integral of f(x) = %s in range [%.2f, %.2f] is %.3f\n",
               names[choice - 1], a, b, result);
    }
    
    exit(0);
}
Ну и пруфы для ТС'а, что все работает, и даже меню есть (а также еще пара функций в виде бонуса ):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
~/samples/c $ make
cc -std=c99 -pedantic -pedantic-errors -Wall -Wextra -Werror -Wno-error=format -Wstrict-prototypes -g3    -c -o main.o main.c
cc -lm   -o sample main.o
~/samples/c $ ./sample 
Select function to integrate
   1> sin x
   2> cos x
   3> tan x
   4> e^x
   5> x^2
or enter 0 to exit
 
>>> 1
Left bound: 0
Right bound: 1
Integral = 0.459 (10 steps)
Integral of f(x) = sin x in range [0.00, 1.00] is 0.459
~/samples/c $

UPD: убрал #include <stdbool.h>, переименовал макросы
0
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 13
11.09.2012, 21:37  [ТС]
#include <stdbool.h> у меня вот с этой библиотекой не работает, и после ввода номера функции он считает и сразу закрывает окно.. т.е. не видно результата..

VisialStudio 8.0 эксперсс выпуск

Добавлено через 12 минут
я создаю новый проект => там win32=> консольное приложение=>консольное приложение, пустой проект, далее создаю файл исходного кода и ввожу туда код, далее пытаюсь запустить
.
.
.
------ Построение начато: проект: asdf, Конфигурация: Debug Win32 ------
Компиляция...
www.cpp
c:\documents and settings\paul\мои документы\visual studio 2008\projects\asdf\asdf\www.cpp(4) : fatal error C1083: Не удается открыть файл include: stdbool.h: No such file or directory
Журнал построения был сохранен в "file://c:\Documents and Settings\Paul\Мои документы\Visual Studio 2008\Projects\asdf\asdf\Debug\BuildLog.h tm"
asdf - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
если удаляю библиотеку stdbool.h, то выводит консоль, там я могу ввожу номер функции и окно сразу закрывается
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
11.09.2012, 23:00
Цитата Сообщение от Nameless One Посмотреть сообщение
у тебя немного не то (хотя считает правильно).
Ну я самым кондовым способом сделал. Вычислений действительно много получается, за то просто...

Цитата Сообщение от М а К с Посмотреть сообщение
после ввода номера функции он считает и сразу закрывает окно.. т.е. не видно результата..
Окно появляется на доли секунды и исчезает

Цитата Сообщение от М а К с Посмотреть сообщение
если удаляю библиотеку stdbool.h, то
нужно бы добавить
C
1
2
3
#define false 0
#define true 1
typedef int bool;
Nameless One, кстати, а зачем оно там? Я как-то ни одной переменной типа bool не разглядел...
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.09.2012, 02:10
easybudda, второй параметр функции adjust_step первоначально был булевым, я решил заменить его на что-то более явное, а хэдер убрать забыл


Цитата Сообщение от М а К с Посмотреть сообщение
#include <stdbool.h> у меня вот с этой библиотекой не работает, и после ввода номера функции он считает и сразу закрывает окно.. т.е. не видно результата..
убери эту строку из исходника, она не нужна (я отредактировал свое сообщение). Еще, возможно, придется убрать макрос DEBUG, т.к. вряд ли студия хорошо поддерживает C99.
0
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 13
13.09.2012, 00:45  [ТС]
------ Построение начато: проект: aaa, Конфигурация: Debug Win32 ------
Компиляция...
aaa.cpp
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(1) : warning C4627: #include <math.h>: пропущен при поиске использования предкомпилированного заголовка
Добавление директивы в "stdafx.h" или перестройка предкомпилированного заголовка
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(3) : warning C4627: #include <stdlib.h>: пропущен при поиске использования предкомпилированного заголовка
Добавление директивы в "stdafx.h" или перестройка предкомпилированного заголовка
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(9) : warning C4005: DEBUG: изменение макроопределения
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(7): см. предыдущее определение 'DEBUG'
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(33) : warning C4005: DEF_FUNC: изменение макроопределения
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(26): см. предыдущее определение 'DEF_FUNC'
c:\documents and settings\paul\мои документы\visual studio 2008\projects\aaa\aaa\aaa.cpp(164) : fatal error C1010: непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву "#include "stdafx.h"" в источник.
Журнал построения был сохранен в "file://c:\Documents and Settings\Paul\Мои документы\Visual Studio 2008\Projects\aaa\aaa\Debug\BuildLog.htm "
aaa - ошибок 1, предупреждений 4
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Добавлено через 2 минуты
Нужно больше практики, а пока времени не хватает... спасибо парни, что помогаете.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
13.09.2012, 01:24
Цитата Сообщение от М а К с Посмотреть сообщение
я создаю новый проект => там win32=> консольное приложение=>консольное приложение, пустой проект, далее создаю файл исходного кода и ввожу туда код
Создайте просто пустой проект безо всяких win32->консольных приложений, или открывайте включённый студией в проект файл stdafx.h и все строки, начинающиеся с #include туда перенесите.

Цитата Сообщение от М а К с Посмотреть сообщение
DEBUG: изменение макроопределения
...
DEF_FUNC: изменение макроопределения
А вот с этим в студии скорее всего беда...
0
 Аватар для defer
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
13.09.2012, 01:25
при создании проекта win32->консольное приложение, отмечайте галку "Пустой проект"
0
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 13
13.09.2012, 12:12  [ТС]
Хм... а как убрать макрос DEBUG? может без него все сложится более удачно.

Добавлено через 22 минуты
что-то странное, чуть переделал код теперь выдает, что я что-то не так ввел
Incorect input

Добавлено через 2 минуты
Как картинку вставить?
0
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 13
13.09.2012, 12:15  [ТС]
Вот картинка
Вложения
Тип файла: pdf Безымянный.pdf (91.5 Кб, 15 просмотров)
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.09.2012, 12:36
М а К с, покажи переделанный код
0
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 13
13.09.2012, 12:37  [ТС]
Так, чуть исправил код, все заработало!! )) Спасибо всем! Name и Budda вам отдельное спасибо за помощь.
Удачи вам и успехов....
сейчас буду разбираться что каждая строчка значит )))


 Комментарий модератора 
правила форума, п.3.6: Если какой-либо пост на форуме показался вам полезным, нажмите кнопку "Спасибо" внизу самого поста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2012, 12:37

Интегрирование функции разными способами
Дали задание в университете, мол, реализуйте интегрирование функции вида f(x) методами прямоугольников,трапеций, Симпсона. И вроде всё...

Численное решение алгебраических уравнений: метод секущих
Формулировка задания (скрин с формулой и интервалами приаттачен): 1. Создать и отладить программу отделения всех корней функции f(x) на...

Задание на тему Численное Интегрирование и Численное Дифференцирование
Прошу помощи с этими двумя заданиями. В обоих 21 вариант. Прилагаю контрольные примеры к ним.

Численное интегрирование
Написал программу для интегрирования методами прямоугольников, трапеций и Симпсона. Проблема в следующем: допустим я выбираю метод...

Численное интегрирование
Помогите пожалуйста с первыми 3-мя методами.Выдает ошибку , либо в самих функциях либо при вычислениях.Не могу понять,либо что-то не...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru