Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите пожалуйста найти ошибку в курсовой Visual C++ 6.0 (http://www.tehnari.ru/f41/t36303/)

Weles 23.05.2010 22:08

Помогите пожалуйста найти ошибку в курсовой 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 24.05.2010 18:17

Может тогда так, тут всё работалос другой функцией, я ввёл свою функцию и теперь не работает, поидее задание то одно и то же.
Код:

#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 нажимаю энтер и опять ничего не происходит:eek:.

Weles 25.05.2010 14:56

Нет, последняя не подойдёт, надо что то с первой делать, ну хоть что нибудь подскажите пожаааался:)

Weles 26.05.2010 16:50

Уже не надо, на 3 хватило:D


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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.