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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2009, 02:49   #1
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию С (Си) - интеграл 3-мя методами

Добрый вечер... Эээээ... Ночи Уважаемые программисты!
Сижу, засыпаю уже, на среду сдать надо.
Очень прошу Вашей помощи. Задание:
Найти значение интеграла на отрезке [a,b]. Количество отрезков вводим с клавиатуры. Включить в программу точное значение интеграла (самому посчитать), найти погрешность. На печать вывести примерное значение, точное и погрешность.

Сама функция: x*exp(x)*sin(x). Отрезок: [0,1].
Методы:
1.Прямоугольников
2. Трапеций
3. Парабол (Симпсона).
Теория: http://ru.wikipedia.org/wiki/%D0%A7%...BA.D0.BE.D0.B2


Пытался считать в маткаде - вышло 0.644.

Итак, сама "программа" (иначе не назовешь):
Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>




int main()

{

int n, a=0, b=1;
float  x,k, d, S;



printf ("Rozrahunkova robota No 1\n");
printf ("Programa dl9 znahodzhenn9 znachenn9 integralu\n");
printf ("Metod 1: metod pr9mokutnikiv\n");
printf ("Metod 2: metod trapeciy\n");
printf ("Metod 3: metod parabol (metod Simpsona\n");
printf ("Press 0 to exit\n");

for (;;)

{

printf ("Viberite metod\n");

scanf ("%d", &n);			//оператор введення
     switch(n)				//оператор вибору
     {
     case 1:

		printf ("vvedite kol-vo sahgov\n");

		scanf ("%d", &k);

		d=(b-a)/k;
		S=0 ;


		for (x=a; x<=b; x+=d)
		{
		S=S+(x*exp(x)*sin(x))*d;
		}

		printf ("korin'=%f\n",S);
		break;

	 case 2: 
		printf ("vvedite kol-vo sahgov\n");
		scanf ("%d", &k);
		d=(b-a)/k;
		
		S=(a*exp(a)*sin(a)+b*exp(b)*sin(b))/2;
		for (x=a+d;x<=b-d; x+=d)
		{
		S+=x*exp(x)*sin(x);
		S*=d;
		}
		printf ("korin'=%f\n",S);
		break;


     case 3: 
		printf ("vvedite kol-vo shagov\n");
		scanf ("%d", &k);

		d=(b-a)/6*k;
		
		S=0;
		for (x=a;x<=b; x+=d)
		{
		S=S+d*(a*exp(a)*sin(a)+4*((a+b)/2)*exp((a+b)/2)*sin((a+b)/2)+b*exp(b)*sin(b));
		}
		printf ("korin'=%f\n",S);

     		break;



     case 0: return(0);
     }



printf ("Programa rabotu zakin4yla\n");
printf ("--------------------------------------------------------------\n");


rewind(stdin);				 //очищення пам'яті


}


getchar ();
return 0;
}
Первым методом выдает "0" , вторым - число, но никак не похожее на точное, 3-м - вообще зацикливается

работаю через Borland C++ 3.1

Очень прошу Вашей помощи, нету сил уже сражаться...

Всем огромное спасибо, кто откликнется!
MR_Andrew вне форума Ответить с цитированием
Старый 29.12.2009, 13:51   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

i
Код:
nt n, a=0, b=1;
float  x,k, d, S;
Код:
scanf ("%d", &k);
Код:
d=(b-a)/6*k;
Видите ошибки?
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 29.12.2009, 14:23   #3
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

в своих методах ты пытаешься присвоить переменной цикла деятичное значение (не целое!), а переменная цикла всегда (!!!) целое значение, поэтому в первом методе у тебя всегда будет 0 (можешь проверить построковой отладкой, сколько раз проходит цикл, если 1 раз, то я верно подметил)
Вывод: переменная цикла - это и есть количество шагов, к-рое ты просишь ввести; в цикл подставляй:
(x = a; x <= k; x++);
далее потребуется для вычислений переменная типа float, (назовём её R),
float R = a;
for (x = a; x<=k; x++)
{
R += d;
S=S+(R*exp(R)*sin(R))*d;
}


Остальные задания аналогично

я был бы рад, если бы кому-то я помог...
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 29.12.2009, 16:25   #4
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

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




int main()

{

int n,i;
float  x, k, d, S ,W=0, a=0, b=1;



printf ("Rozrahunkova robota No 1\n");
printf ("Programa dl9 znahodzhenn9 znachenn9 integralu\n");
printf ("Metod 1: metod pr9mokutnikiv\n");
printf ("Metod 2: metod trapeciy\n");
printf ("Metod 3: metod parabol (metod Simpsona\n");
printf ("Press 0 to exit\n");

for (;;)

{

printf ("Viberite metod\n");

scanf ("%d", &n);			//оператор введення
     switch(n)				//оператор вибору
     {
     case 1:
	     {
		printf ("vvedite kol-vo sahgov\n");

		scanf ("%f", &k);

		d=(b-a)/k;
		S=0 ;


		for (x=a; x<=b; x+=d)
		{
		S=S+(x*exp(x)*sin(x))*d;
		}

		printf ("korin'=%f\n",S);
	    }
		break;

	 case 2:
		printf ("vvedite kol-vo sahgov\n");
		scanf ("%f", &k);
		d=(b-a)/k;

		S=(a*exp(a)*sin(a)+b*exp(b)*sin(b))/2;
		for (x=a+d;x<=b-d; x+=d)
		{
		S+=x*exp(x)*sin(x);
		}
		S*=d;
		printf ("korin'=%f\n",S);
		break;


     case 3:
	     {
		printf ("vvedite kol-vo sahgov\n");
		scanf ("%f", &k);

		d=(b-a)/2*k;

		for (i=1;i<=2*n-1;i+=2)
		{
		S=S+(a+d*i)*exp(a+d*i)*sin(a+d*i);
		}

		for (i=2; i<=2*n-2; i+=2)
		{
		W=W+(a+d*i)*exp(a+d*i)*sin(a+d*i);
		}
	     S= (b-a)/(6*n)*(a*exp(a)*sin(a)+4*S+2*W+(a+2*d*n)*exp(a+2*d*n)*sin(a+2*d*n));

		printf ("korin'=%f\n",S);
              }
		break;



     case 0: return(0);
     }



printf ("Programa rabotu zakin4yla\n");
printf ("--------------------------------------------------------------\n");


rewind(stdin);				 //очищення пам'яті


}


getchar ();
return 0;
}
Первые 2 вышли, правда пока еще без подсчета погрешности.
А вот 3-й рогом уперся, никак.
Кто-то может, пожалуйста, глянуть, чего оно?


RUSt88 и Sweta - огромное спасибо, учел
MR_Andrew вне форума Ответить с цитированием
Старый 29.12.2009, 19:26   #5
Crusher
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 27
По умолчанию

В книге нашел более удобную формулу для метода прабол. Работать наверное не будет.

Код:
d=(b-a)/k;

float y[k];

for (i=0;i<=k;i++)
{
y[i]=x*exp(x)*sin(x);
}

S=0;
for (i=0;i<=k;i++)
{
S=S+(d/3)*(y[2k-2]+4y[2k-1]+y[2k]);
}

Последний раз редактировалось Crusher; 30.12.2009 в 10:57.
Crusher вне форума Ответить с цитированием
Старый 29.12.2009, 19:27   #6
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Поскольку действовать нужно было срочно, то договорился с одногруппником. Просидел полтора часа в общаге, сделали

Еще напишу комментарий и выложу сюда полностью готовый код
MR_Andrew вне форума Ответить с цитированием
Старый 29.12.2009, 23:24   #7
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Готово
Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>




int main()

{

int n,i;
float  x, k, d, S=0 ,W=0, a=0, b=1,t=0.6436776, poh;



printf ("Rozrahunkova robota No 1\n");
printf ("Programa dl9 znahodzhenn9 znachenn9 integralu\n");
printf ("Metod 1: metod pr9mokutnikiv\n");
printf ("Metod 2: metod trapeciy\n");
printf ("Metod 3: metod parabol (metod Simpsona\n");
printf ("Press 0 to exit\n");

for (;;)

{

printf ("Viberite metod\n");

scanf ("%d", &n);			//оператор введення. Зчитуємо введений метод
     switch(n)				//оператор вибору. Вибираємо метод обчислення
     {
    	 case 1:
	    
		printf ("vvedite kol-vo sahgov\n"); 	//вибір кількості кроків обчислення

		scanf ("%f", &k);			//введення значення

		d=(b-a)/k;				//за формулою обчислення інтегралу методом 
				//прямокутників щукоємо значення виразу. Знаходимо різницю кінців
				//проміжків інтергрування і ділимо її на к-ть кроків
		for (x=a; x<=b; x+=d)	//у циклі перебираємо значення, щоразу нарощуючи його на d
		{
		S=S+(x*exp(x)*sin(x));	//за формулою прямокутників обчислюємо значення S 
		}
		S=S*d;			//S множимо на d
		poh=fabs(S-t)/t*100;	//знаходимо значення абсолютної похибки

		printf ("integral'=%f\npoh=%f%%\n",S,poh); 	//виводимо результат
		printf ("to4ne zna4enn9'=%f\n",t);	    //точне значення (обчислене на калькуляторі)
	    
		break;

	 case 2:
		printf ("vvedite kol-vo sahgov\n");   //вибір кількості кроків обчислення
		scanf ("%f", &k);		     //введення значення
		d=(b-a)/k;				//Знаходимо різницю кінців проміжків інтергрування 
								//і ділимо її на к-ть кроків
		S=(a*exp(a)*sin(a)+b*exp(b)*sin(b))/2; //за формулою трапецій знаходимо значення S
		for (x=a+d;x<=b-d; x+=d)	//у циклі перебираємо значення х
		{
		S+=x*exp(x)*sin(x);		//за формулою трапецій обчислюємо значення S
		}
		S*=d;				//S множимо на d
       		poh=fabs(S-t)/t*100;		 //знаходимо значення абсолютної похибки

		printf ("integral'=%f\npoh=%f%%\n",S,poh);	//виводимо результат
		printf ("to4ne zna4enn9'=%f\n",t);	    //точне значення (обчислене на калькуляторі)
		break;


   	  case 3:

		printf ("vvedite kol-vo sahgov\n"); 		//вибір кількості кроків обчислення
		scanf ("%f", &k);				//введення значення

		d=(b-a)/(2*k);		//Знаходимо різницю кінців проміжків інтергрування 
							//і ділимо її на подвоєну к-ть кроків
		for (i=1;i<=2*k-1;i+=2)		//у циклі перебираємо значення і, які потрібні для
		  {				//отримання проміжних результатів
		  S=S+(a+d*i)*exp(a+d*i)*sin(a+d*i);	//обчислюємо проміжне значення S
		  }

		for (i=2; i<=2*k-2; i+=2) 		//у циклі перебираємо нове значення і
		  {
		  W=W+(a+d*i)*exp(a+d*i)*sin(a+d*i); 	//обчислюємо проміжне значення W
		   }
	   	S=(b-a)/(6*k)*(a*exp(a)*sin(a)+4*S+2*W+(a+2*d*k)*exp(a+2*d*k)*sin(a+2*d*k));
			//обчислюємо остаточне значення інтергалу за формулою парабол (Симпмона)
       		
		poh=fabs(S-t)/t*100;		//знаходимо значення абсолютної похибки

		printf ("integral'=%f\npoh=%f%%\n",S,poh);	 //виводимо результат
       		printf ("to4ne zna4enn9'=%f\n",t);	//точне значення (обчислене на калькуляторі)
		break;

     case 0: return(0);
     }


printf ("Programa rabotu zakin4yla\n");
printf ("--------------------------------------------------------------\n");


rewind(stdin);				 //очищення пам'яті


}


getchar ();
return 0;
}
MR_Andrew вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со списками методами STL JeyKip Общие вопросы C/C++ 5 17.12.2009 02:13
С (Си) - корень 4-я методами MR_Andrew Общие вопросы C/C++ 26 16.12.2009 20:00
Создание MediaPlayer методами DirectShow AlexFAst Мультимедиа в Delphi 1 29.09.2009 01:16
Работа со строками и методами в Java PavelZet Помощь студентам 1 02.06.2009 05:36
Пишу *.dll помогите с методами mdbm Общие вопросы Delphi 11 28.05.2008 14:19