Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #pragma warning ( disable : 4996)
- using namespace std;
- double Input()
- {
- double Number;
- while (true)
- {
- printf("%s", "Write epsilon: ");
- scanf("%lf", &Number);
- if (Number > 0.1 || Number < 0.0000001)
- {
- printf("%s", "Incorrect epsilon, epsilon must be more then 10^(-7) and less then 10^(-1) try again...\n");
- }
- else
- {
- return Number;
- }
- }
- }
- double func1(double x)
- {
- return x * sqrt(1 + x);
- }
- double func2(double x)
- {
- return asin(sqrt(x)) / sqrt(x * (1 - x));
- }
- double func3(double x)
- {
- return pow(2, x) / (1 + pow(4, x));
- }
- double integral(double func(double(x)), double left_border, double right_border, long long num_of_divizions)
- {
- double area = 0, height = abs((right_border - left_border) / num_of_divizions);
- for (long long i = 0; i < num_of_divizions; i++)
- {
- area += ((func(left_border) + func(left_border + height)) / 2) * height;
- left_border += height;
- }
- return area;
- }
- double integral(double func(double), double left_border, double right_border, double epsilon)
- {
- int sign = 1;
- if (left_border > right_border)
- {
- swap(right_border, left_border);
- sign = -1;
- }
- double actual_area;
- double next_area;
- long long i = 2;
- while (true)
- {
- actual_area = integral(func, left_border, right_border, i);
- next_area = integral(func, left_border, right_border, i * 2);
- if (abs(actual_area - next_area) <= epsilon)
- {
- printf("Number of divizions: %lld %c", i * 2, '\n');
- return next_area * sign;
- }
- i*=2;
- }
- }
- int main()
- {
- double epsilon;
- epsilon = Input();
- printf("%s %lf %c", "Integral of func #1: ", integral(&func1, 2, 7, epsilon), '\n');
- printf("%s %lf %c", "Integral of func #2: ", integral(&func2, 0.2, 0.3, epsilon), '\n');
- printf("%s %lf %c", "Integral of func #3: ", integral(&func3, -13, -2, epsilon), '\n');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement