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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2017, 19:02   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Метод трапеций Си

Добрый день. Дано выражение:
Код:
arcsin(sqrt(x/(1+x)))  [a=0;b=3]  h=0.001
Получается n= (3-0)/0.001=3000

Подскажите пожалуйста, правильное ли следующее решение:
Код:
/*-----------------Метод трапеции-------------------*/
float f1(float a, float b, int n)
{
	float h,sum,x;
	int i;
	sum = 0;
	h=(b-a)/n;
	sum += asin((sqrt(a/(1+a)))); //   sqrt(tan(a));
	for(i = 1; i < n; i++)
	{
		x = a + i*h;
		sum += 2* asin((sqrt(x/(1+x))));
	}
	x = a + n*h;
	sum +=  asin((sqrt(x/(1+x))));
	return(0.5*h*sum);
}
float ingdv(float a, float b, float e, float (*f)(float,float,int))
{
	
	int n=(b-a)/e;
	float p,k;
	k = f(a,b,n);
	do{
		p = k;
		k = f1(a,b,2*n);
		n = n*2;

	}while(abs(p-k)<e);
	return k;
}

int main()
{
	setlocale(LC_CTYPE,"Russian");
	float e=0.001;
	float a=0, b=3;
	float rez;
	printf("\nРешение интеграла 3-мя методами:\n\n");
	rez = ingdv(a,p/b,e,f1);
	printf("Метод Трацеция %f\n",rez);
	rez = ingdv(a,p/b,e,f2);
	printf("Метод Прямоугольник %f\n",rez);
	rez = ingdv(a,p/b,e,f3);
	printf("Метод Симпсона %f\n\n",rez);

	return 0;
}
Вероника99 вне форума Ответить с цитированием
Старый 02.12.2017, 20:25   #2
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Не подскажете?(
Вероника99 вне форума Ответить с цитированием
Старый 03.12.2017, 00:26   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Просто такое задание даже в онлайн-решениях не могу перепроверить,т.к слишком большой диапазон n(((
Вероника99 вне форума Ответить с цитированием
Старый 03.12.2017, 05:27   #4
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

И где там большое?
Изображения
Тип файла: jpg Безымянный.jpg (91.8 Кб, 160 просмотров)
Мановар вне форума Ответить с цитированием
Старый 03.12.2017, 10:58   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Интересно, откуда такое берется такой расчет начального n ? Действительно, заданная точность достигается при ориентировочно 2048 точках. Но для Симпсона это будет уже чересчур - он сходится гораздо быстрее, в данном случае - уже на 64 точках.
1 32 0,18750000 78,54065388 2,45439543
2 64 0,09375000 157,17844201 2,45591316
3 128 0,04687500 314,42530490 2,45644769
4 256 0,02343750 628,89890217 2,45663634
5 512 0,01171875 1257,83192182 2,45670297
6 1024 0,00585938 2515,68795777 2,45672652

А вот почему в ingdv для первого приближения берется функция как параметр f, а в цикле - конкретная функция f1 (т.е. всегда метод трапеций) ?
Код:
k = f(a,b,n);
	do{
		p = k;
		k = f1(a,b,2*n);
Остается ждать Симпсона Прямоугольник - вообще отстой.

Последний раз редактировалось digitalis; 03.12.2017 в 12:29.
digitalis вне форума Ответить с цитированием
Старый 03.12.2017, 18:58   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Если проблема в формуле, тогда можешь (временно, на время отладки) заменить формулу на что-то по проще...


А что такое "p" в выражении:
Код:
rez = ingdv(a,p/b,e,f1);
мне кажется, что в "while(abs(p-k)<e);" надо ">"...
Короче, проанализируй результаты работы программы:

Код:
#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <math.h>

float f1(float a, float b, int n)
{
	float h, sum, x;
	int i;
	sum = 0;
	h = (b - a) / n;
	sum += asin((sqrt(a / (1 + a)))); //   sqrt(tan(a));
	for (i = 1; i < n; i++)
	{
		x = a + i*h;
		sum += 2 * asin((sqrt(x / (1 + x))));
	}
	x = a + n*h;
	sum += asin((sqrt(x / (1 + x))));
	return(0.5*h*sum);
}
float ingdv(float a, float b, float e)
{
	int n = 1;
	float p, k;
	k = f1(a, b, n);
	do {
		p = k;
		k = f1(a, b, n + 10);

		printf(" %d -> %f- %f= %f\n", n, p, k, abs(p - k));
		n = n + 10;
	} while (abs(p - k)>e);
	printf("\n");
	return k;
}

int main()
{
	float e = 0.001;
	float a = 0, b = 3;
	float rez;

	rez = ingdv(a, b, e);
	printf("Метод Трацеция %f\n", rez);
	
	scanf("%f", &a);// чтобы консоль не закрывалась
	return 0;
}
ura_111 вне форума Ответить с цитированием
Старый 03.12.2017, 19:05   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

В саму функцию:
Код:
float f1(float a, float b, int n)
я не смотрел...
Почему у тебя "sum" считается в цикле, а потом (ещё) за его пределами?
Так надо?
(я не в курсе. Расскажи теорию на ручном примере).


p.s.: наверно, не правильно вывел "n" в
Код:
printf(" %d -> %f- %f= %f\n", n, p, k, abs(p - k));
надо "n+10", потому что на в предыдущем операторе именно так. Или сначала увеличить кол-во шагов "n = n + 10;", а потом выводить на экран данные для анализа...

Последний раз редактировалось ura_111; 03.12.2017 в 19:09.
ura_111 вне форума Ответить с цитированием
Старый 03.12.2017, 23:12   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Почему у тебя "sum" считается в цикле, а потом (ещё) за его пределами?
Рациональней это делают так :
Код:
  h = (b-a)/n ; x = a + h ; sum = f(a) + f(b) ;
   for (i=1;i<n;i++)
     { sum=sum+2*f(x) ; x += h ; }
Крайние отсчеты идут с весом 1, все средние - с весом 2.
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Численное интегрирование. метод трапеций паскаль Оксид Помощь студентам 3 31.05.2017 16:48
Метод Рунге-Кутта 4-го порядка + метод трапеций Bugrimov Помощь студентам 0 09.11.2013 21:48
Метод трапеций и метод Симпсона (C) Zadora Помощь студентам 3 19.12.2011 09:51
ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННЫХ ИНТЕГРАЛОВ (метод трапеций) maliyusha Помощь студентам 13 25.12.2008 00:34
Метод Симпсона, прямоугольников и трапеций. Buble07 Помощь студентам 2 15.11.2008 11:03