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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2016, 16:06   #1
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию Приближенное вычисление определенного интеграла

Задание: Функция f(x)=x*x*arcctg(x/2)/x, отрезок a=1, b=2, точность E=0,005. Использовать квадратурную формулу трапеция, язык программирования С++, многопоточное программирование.

Вопрос: Подскажите,пожалуйста, что я делаю неправильно, почему результат уходит в бесконечность?

Код:
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <ctime>
#include <fstream>

using namespace std;

double f(double x)
{
	return (x*x*(atan(-x / 2) + 3.14 / 2) / x);
}

bool func1(double a, double b, double e, double *func)
{
	double f1, f2, fsr, s1, s2, sl;
	double sr = (a + b) / 2;
	double h = b - a;
	f1 = f(a);
	f2 = f(b);
	fsr = f(sr);
	s1 = 0.5*h*(f1 + f2);
	sl = 0.25*h*(f1 + fsr);
	sr = 0.25*h*(fsr + f2);
	s2 = sl + sr;
	*func = s2;
	if (fabs(s1 - s2)<e)
		return true;
	else
		return false;
}

double func2(double a, double b, double e, int T)
{
	if (T == 1)
	{
		double fx;
		if (func1(a, b, e, &fx))
			return fx;
		double m = (a + b) / 2;
		double e1 = e / 2;
		double a1, b1;
		a1 = func2(a, m, e1, T);
		b1 = func2(m, b, e1, T);
		return a1 + b1;
	}
	else
	{
		T = T / 2;
		thread func_thread1(func2, a, b, e, T);
		thread func_thread2(func2, a, b, e, T);
		if (func_thread1.joinable())
			func_thread1.join();
		if (func_thread2.joinable())
			func_thread2.join();
	}
}

int main(int argc, char *argv[])
{
	setlocale(0, "");
	srand(time(0));
	int T, n = 100;
	double a = 1, b = 2, e = 0.005, I = 0.0, h;
	cout << "Введите кол-во потоков: ";
	cin >> T;
	h = (b - a) / n;
	//n--;

	I = func2(a, b, e, T);
	cout << "I= " << I << endl;

	cout << endl << endl;
	system("pause");
	return 0;
}
Изображения
Тип файла: png skrin.png (24.0 Кб, 52 просмотров)
Novichok2016 вне форума Ответить с цитированием
Старый 03.06.2016, 16:47   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

А что за странная функция f(x)=x*x*arcctg(x/2)/x ?
Почему нельзя сократить x ?

]f(x) = x*x*arcctg(x/2)/x = x*arcctg(x/2)
type_Oleg вне форума Ответить с цитированием
Старый 03.06.2016, 19:08   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Можно. Но это-ж такая фигня , получится...
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 03.06.2016, 22:57   #4
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию

Можно сократить, но ничего не изменится - интеграл не вычисляется...
Novichok2016 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление определенного интеграла (Си) Alex_Kardo Помощь студентам 2 09.11.2015 09:56
Вычисление определенного интеграла на VBA adel_stein Помощь студентам 0 08.01.2014 16:51
Вычисление определенного интеграла. Diamond2107 Общие вопросы C/C++ 4 29.03.2011 17:55
Вычисление определенного интеграла. Diamond2107 Общие вопросы C/C++ 1 19.03.2011 17:51
Приближенное вычисление опред. интеграла. Поправте код. fos1k Помощь студентам 5 20.12.2009 23:29