C/C++

Помогите задача информатика 9 класс вычислить значение интеграла а выводится -nan(ind)

#include <iostream>
#include <cmath>

float integral(float x) {
return (sqrt(x))/(x + sin(x))


;
}
using namespace std;

int main()
{
float x = 0;
float sum = 0;
float dx = 0.00001;


while (x <= 6)
{
sum = sum + integral(x) * dx;
x = x + dx;

}
cout << sum;

}


Вывод почему то -nan(ind)
Естественно, что ∫(0;6) ✓x dx / (x + sin(x)) у Вас не вычисляется, как и должно быть, так как этот несобственный интеграл расходится к +∞, потому что подынтегральная функция имеет простой полюс порядка 0,5 в крайней левой точке области интегрирования.Если уж надо взять сходящийся интеграл от этой функции, то берите положительные пределы интегрирования a и b (a≤b), количество равномерных интервалов n и считайте не по формуле прямоугольников, а хотя бы, например, по формуле трапеций, что на порядки точнее:
 #include  
#include
double f(double x)
{
return sqrt(x) / (x + sin(x));
}
int main()
{
double a, b, h, i, n, s;
std::cout.precision(16);
while (true)
{
std::cout > a >> b >> n;
h = (b - a) / n;
s = (f(a) + f(b)) * 0.5;
for (i = 1.; i < n; i += 1.)
s += f(a + i * h);
std::cout
Станислав Будянский
Станислав Будянский
66 572
Лучший ответ
Станислав Будянский А вообще-то ∫(0;6) ✓x dx / (x + sin(x)) - сходящийся интеграл. Как я уже сказала, подынтегральная функция имеет в точке х=0 простой полюс порядка 0,5. Более подробная асимптотика при х→0 такая:
✓x / (2x) = 1 / (2✓x).
Но несобственный интеграл
∫(0;6) dx / (2✓x) равен ✓x | (0; 6) = ✓6.
Значит и указанный несобственный интеграл сходится к конечной величине, а не расходится к +∞.
Можно выделить в области интегрирования небольшой сингулярный участок, допустим, [0;0,001], и вычислять интеграл на этом промежутке, например, методом средних, а в остальной области интегрирования по методу Симпсона. Так и делаем.
Станислав Будянский
 #include  
#include
using namespace std;
double f(double x)
{
return sqrt(x) / (x + sin(x));
}
int main()
{
double a = 0.001, b = 6., h, hp, i, n, s, u, v, x;
cout.precision(16);
while (true)
{
cout > n;
h = a / n;
s = 0.;
for (i = 1.; i < n; i += 1.)
s += f((i - 0.5) * h);
s *= h;
h = (b - a) / 10000.;
hp = h * 0.5;
u = f(b - hp);
v = 0.;
for (i = 1; i < 10000.; i += 1.)
{
x = a + i * h;
u += f(x - hp);
v += f(x);
}
s+=(f(a)+f(b)+4.*u+2.*v)*h/6.;
cout
Очевидно же: х=0. Пытаемся вычислить ноль делённый на ноль.
Виталий -
Виталий -
94 037
Спасибо за испорченную табуляцию, для кого создали блоки кода?
Проблема возникает из-за неопределенности деления на ноль при вычислении значения функции в точке x=0 (потому нужно использовать значение, как минимум, близкое к нулю), а так же отсутствия проверки на ноль. И никогда не используй using namespace std - это мерзко. Код:

 #include  
#include

float integral(float x)
{
if (x == 0) // добавляем проверку деления на ноль
{
return 0;
}
else
{
return (sqrt(x)) / (x + sin(x));
}
}

int main()
{
float x = 0.00001; // изменяем начальное значение x
float sum = 0;
float dx = 0.00001;

while (x
Андрей Вологжанин С чего ты вообще взял, что f(0) = 0 - легитимная подстановка значения?
#include <iostream>
#include <cmath>

float integral(float x) {
return (sqrt(x)) / (x + sin(x));
}

using namespace std;

int main() {
float x = 0.00001; // Изменено начальное значение x
float sum = 0;
float dx = 0.00001;

while (x <= 6) {
sum = sum + integral(x) * dx;
x = x + dx;
}

cout << su
m;

return 0;
}