Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 23.05.2010, 22:08   #1 (permalink)
Weles
Лентяй
 
Аватар для Weles
 
Регистрация: 13.04.2009
Адрес: Тверь
Сообщений: 16,556
Записей в дневнике: 29
Сказал(а) спасибо: 15
Поблагодарили 81 раз(а) в 14 сообщениях
Репутация: 24915
По умолчанию Помогите пожалуйста найти ошибку в курсовой Visual C++ 6.0

Помогите пожалуйста, преподаватель говорит что первая часть правильно а вот дальше надо искать.
Код:
#include "stdafx.h"

#include "math.h"


int main()
{
	int i,n;
	float a,b,h,x,I0,I1,eps;
	a=0;
	b=exp(1);
	printf("n=");
	scanf("%i",&n);
	h=(b-a)/n;
	eps=0.0001;
	x=a+h;
	I0=sin(log(x))/x;
	for (i=2;i<=n;i++)
	
		x=x+h;
	I0=I0+(sin(log(x))/x);
	
	I0=I0*h;
	I1=0;
	while (fabs(I0-I1)>=eps)
	{
		I1=I0;
		n=2*n;
		h=(b-a)/n;
		x=a+h;
		I0=sin(log(a))/a;
		for (i=2;i<=n;i++)
		{
			x=x+h;
			I0=I0+sin(log(x))/x;
		}
		I0=I0*h;
    }
	printf("integral=%f \n",I0);
	
	return 0;
}
Ошибок не находит но при запуске программы просит ввести n, ввожу нажимаю энтер, курсор перескакивает и прграмма больше ни на что не реагирует.
Цитата:
Задание:1) вычислить определенный интеграл с заданной точностью ε методами: правых прямоугольников, центральных прямоугольников, левых прямоугольников, трапеций, Симпсона. Сравнить полученные результаты, сделать выводы; 2) исследовать зависимость точности вычисления интеграла ε от числа шагов n. Сравнить полученные результаты, сделать выводы; 3) для наглядности полученных результатов использовать таблицы и графики; 4) сделать презентацию курсовой работы. Точность 0.0001
Weles вне форума   Ответить с цитированием

Старый 23.05.2010, 22:08
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Напомню вам, что на форуме есть похожие топики

Помогите найти ошибку в программе
Помогите найти ошибку, Pascal abc

Старый 24.05.2010, 18:17   #2 (permalink)
Weles
Лентяй
 
Аватар для Weles
 
Регистрация: 13.04.2009
Адрес: Тверь
Сообщений: 16,556
Записей в дневнике: 29
Сказал(а) спасибо: 15
Поблагодарили 81 раз(а) в 14 сообщениях
Репутация: 24915
По умолчанию

Может тогда так, тут всё работалос другой функцией, я ввёл свою функцию и теперь не работает, поидее задание то одно и то же.
Код:
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "conio.h"
#include "iostream.h"
double PI = 3.1415926;

/// Определение функции под интегралом
double function(double x)
{
	return (sin(log(x)))/x; //вот сюда ввёл свою функцию
}

/// интегрирование методом центральных прямоугольников (с шагом)
double middleRectangles(double left, double right, double step)
{
	double I = 0;
	for(double xi = left + step * 0.5; xi < right; xi += step)
	{
		I += function(xi);
	}
	I *= step;
	return I;
}

/// интегрирование методом центральных прямоугольников (по числу итераций)
double middleRectangles(double left, double right, int n)
{
	double I = 0;
	// iin?eoaee oaae
	double step = (right - left) / n;
	for(double xi = left + step * 0.5; xi < right; xi += step)
	{
		I += function(xi);
	}
	I *= step;
	return I;
}

/// интегрирование методом левых прямоугольников (с шагом)
/// y[0] y[n-1]
double leftRectangle(double left, double right, double step)
{
	double I = 0;
	for(double xi = left; xi < right; xi += step)
	{
		I += function(xi);
	}
	I *= step;
	return I;
}
/// интегрирование методом левых прямоугольников(по числу итераций)
/// y[0] y[n-1]
double leftRectangle(double left, double right, int n)
{
	double I = 0;
	double step = (right - left) / (double)n;
	for(double xi = left; xi < right; xi += step)
	{
		I += function(xi);
	}
	I *= step;
	return I;
}

/// интегрирование методом правых прямоугольников
/// y[1] y[n]
double rightRectangle(double left, double right, double step)
{
	double I = 0;
	for(double xi = left + step; xi <= right; xi += step)
	{
		I += function(xi);
	}
	I *= step;
	return I;
}
/// интегрирование методом правых прямоугольников (по числу итераций)
/// y[1] y[n]
double rightRectangle(double left, double right, int n)
{
	double I = 0;
	double step = (right - left) / (double)n;
	for(double xi = left + step; xi <= right; xi += step)
	{
		I += function(xi);
	}
	I *= step;
	return I;
}

/// метод трапеций (по шагу)
/// формула трапеции имеет второй порядок точности (m = 2)
double trapezium(double left, double right, double step)
{
	double I= 0;
	for(double xi = left + step; xi < right; xi += step)
	{
		I += function(xi);
	}
	I = (I + 0.5*(function(left) + function(right))) * step;
	return I;
}

/// метод трапеций (по числу итераций)
/// формула трапеции имеет второй порядок точности (m = 2)
double trapezium(double left, double right, int n)
{
	double I = 0;
	double step = (right - left) / (double)n;
	for(double xi = left + step; xi < right; xi += step)
	{
		I += function(xi);
	}
	I = (I + 0.5*(function(left) + function(right))) * step;
	return I;
}



//---------------------------------------------------------------------------
//метод симпсона итерационный (задается числом итераций)
//порядок точности метода Симпсона = 4
double simpson(double a, double b, int n)
{
	double step = (b - a) / n;
	double I = 0, I1 = 0, I2 = 0;
	// в краевых точках
	double I0 = function(a)+function(b);
	I2 = function(a + step);
	for(int iteration = 2; iteration < n; iteration += 2 )
	{
		// нечетные
		I2 += function(a + (iteration + 1) * step);
		// четные
		I1 += function(a + iteration * step);
	}
	I = I0 + 4*I2 + 2*I1;
	/// домножаем на коэффициент шага
	I *= step/3;

	return I;
}

////// левые прямоугольники с заданной точностью
double leftRectangleEpsilon(double left, double right, double epsilon)
{
	int n = 10;
	double I0 = leftRectangle(left, right, n);
	double I1 = 0;

	/// пока погрешность больше заданной увеличиваем число шагов в два раза
	while( fabs(I0 - I1) > epsilon )
	{
		I1 = I0;
		n *= 2;
		I0 = leftRectangle(left, right, n);
	}
	return I0;
}

/// правые прямоугольники с заданной точностью
double rightRectangleEpsilon(double left, double right, double epsilon)
{
	int n = 10;
	double I0 = rightRectangle(left, right, n);
	double I1 = 0;
	while( fabs(I0 - I1) > epsilon )
	{
		I1 = I0;
		n *= 2;
		I0 = rightRectangle(left, right, n);
	}
	return I0;
}

/// Центральные прямоугольники с заданной точностью
double middleRectangleEpsilon(double left, double right, double epsilon)
{
	int n = 10;
	double I0 = middleRectangles(left, right, n);
	double I1 = 0;
	while( fabs(I0 - I1) > epsilon )
	{
		I1 = I0;
		n *= 2;
		I0 = middleRectangles(left, right, n);
	}
	return I0;
}

/// трапеции с заданной точностью
double trapeziumEpsilon(double left, double right, double epsilon)
{
	int n = 10;
	double I0 = trapezium(left, right, n);
	double I1 = 0;
	while( fabs(I0 - I1) > epsilon )
	{
		I1 = I0;
		n *= 2;
		I0 = trapezium(left, right, n);
	}
	return I0;
}

/// Симпсон с заданной точностью
double simpsonEpsilon(double left, double right, double epsilon)
{
	int n = 10;
	double I0 = simpson(left, right, n);
	double I1 = 0;
	while( fabs(I0 - I1) > epsilon )
	{
		I1 = I0;
		n *= 2;
		I0 = simpson(left, right, n);
	}
	return I0;
}


/// печатаем таблицу
void printTable(double (*Fx)(double, double, int), double left, double right, int n, int step)
{
	cout<<"N          "<<"EPSILON"<<endl;
	for(int i = 2; i <= n; i+=step)
	{
		double I0 = Fx(left, right, i);
		double I1 = Fx(left, right, 2*i);
		double epsilon = fabs(I0-I1);
		cout<<"n = "<<i<<" epsilon = "<< epsilon<<endl;
	}
}

/// оценка погрешности по правилу Рунге
/// |I (h/2) - I(h)|
int main(int argc, char ** argv)
{
	double a, b;
	double epsilon = 0;
	a = 0;
	b = PI / 2;

	/// cin<<a;
	/// cin<<b;

	cout<<"Vuberite"<<endl;
	cout<<"1. Vichislenie integrala"<<endl;
	cout<<"2. Tablici"<<endl;

	int vubor = 2;
	cin>>vubor;

	if(vubor == 2)
	{
		cout<<"Vuberite"<<endl;
		cout<<"1. Levie pryamougolniki"<<endl;
		cout<<"2. Pravie pryamougolniki"<<endl;
		cout<<"3. Centralnie pryamougolniki"<<endl;
		cout<<"4. Simpson"<<endl;
		cout<<"5. Trapecii"<<endl;
		cin>>vubor;

		switch(vubor)
		{
		case 1:
			printTable(leftRectangle, a, b, 30, 2);	
			break;
		case 2:
			printTable(rightRectangle, a, b, 30, 2);
			break;
		case 3:
			printTable(middleRectangles, a, b, 30, 2);
			break;
		case 4:
			printTable(simpson, a, b, 30, 2);
			break;
		case 5:
			printTable(trapezium, a, b, 30, 2);
			break;
		default:
			printTable(trapezium, a, b, 100, 10);
			break;
		}
	}
	else
	{
		printf("Vvedite espilon : ");
		cin>>epsilon;

		double simps = simpsonEpsilon(a, b, epsilon);
		double rectL = leftRectangleEpsilon(a, b, epsilon);
		double rectR = rightRectangleEpsilon(a, b, epsilon);
		double rectM = middleRectangleEpsilon(a, b, epsilon);
		double trap = trapeziumEpsilon(a, b, epsilon);

		printf("Otvet method levih pryamoygolnikov  %10.10f.\n", rectL);
		printf("Otvet method pravih pryamoygolnikov   %10.10f.\n", rectR);
		printf("Otvet method Centralnih pryamoygolnikov   %10.10f.\n", rectM);
		printf("Otvet method simpsona  %10.10f.\n", simps);
		printf("Otvet method trapecii  %10.10f.\n", trap);
	}

	getch();

	return 0;
}
С функцией pow(sin(x),3) всё работало, а после ввода моей, спрашивает эпсилон, ввожу 0.0001 нажимаю энтер и опять ничего не происходит.
Weles вне форума   Ответить с цитированием
Старый 25.05.2010, 14:56   #3 (permalink)
Weles
Лентяй
 
Аватар для Weles
 
Регистрация: 13.04.2009
Адрес: Тверь
Сообщений: 16,556
Записей в дневнике: 29
Сказал(а) спасибо: 15
Поблагодарили 81 раз(а) в 14 сообщениях
Репутация: 24915
По умолчанию

Нет, последняя не подойдёт, надо что то с первой делать, ну хоть что нибудь подскажите пожаааался
Weles вне форума   Ответить с цитированием
Старый 26.05.2010, 16:50   #4 (permalink)
Weles
Лентяй
 
Аватар для Weles
 
Регистрация: 13.04.2009
Адрес: Тверь
Сообщений: 16,556
Записей в дневнике: 29
Сказал(а) спасибо: 15
Поблагодарили 81 раз(а) в 14 сообщениях
Репутация: 24915
По умолчанию

Уже не надо, на 3 хватило
Weles вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 14:17.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.