Решение определенного интеграла методом трапеции и левыми прямоугольниками

Помогите пожалуйста обойтись. Необходимо разработать программу, которая вычисляет определенный интеграл методом левых прямоугольников и трапеций.
Есть два основных вопроса:

  1. почему программа отображает разные результаты при подсчете?

  2. Эти два метода рассматриваются для стандартной функции f(x) Как это изменить, чтобы пользователь мог выбрать функцию интегрирования f(x) из списка?

    Как это:

    { sin x, cos x, tan x, ctg x }
    

    IMG

Пожалуйста, помогите мне решить эти проблемы … Вот код, который я получил сейчас:

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"TForm1 *Form1;
//trapezoid method
double fun (double x)
{
return (2*x+1)/sqrt(3+(pow(x,3)));
}
double func(double arg)
{
return arg*arg/2.0;
}

//------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ComboBox1->Items->Add("sin(x)");
ComboBox1->Items->Add("cox(x)");
ComboBox1->Items->Add("tan(x)");
ComboBox1->Items->Add("ctg(x)");
Edit1->NumbersOnly = 1;
Edit2->NumbersOnly = 1;
Edit3->NumbersOnly = 1;
RichEdit1->Lines->Clear();
RichEdit2->Lines->Clear();
RichEdit1->Lines->Add ("Trapezoid solution:");
RichEdit2->Lines->Add ("Solution by the method of left rectangles:");
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n,i;
double a,b,h,x,s,sum,y,eps;
/*double fun (double x)
{
return (2*x+1)/sqrt(3+(pow(x,3)));
}*/
RichEdit1->Lines->Clear();
RichEdit2->Lines->Clear();
RichEdit1->Lines->Add ("Trapezoid solution:");
RichEdit2->Lines->Add ("Solution by the method of left rectangles:");
String A = Edit1->Text, B = Edit2->Text, N = Edit3->Text;
b = StrToInt64(B);
a = StrToInt64(A);
n = StrToInt64(A);
//----------------------------------------------------------trapezoid method
h=(b-a)/n;
x=a;
s=0;
for (i = 0; i<n; i++)
{
s=s+0.5*(fun(x)+fun(x+h))*h;
x=x+h;
}
RichEdit1->Lines->Add(s);
//----------------------------------method of left rectangles:(thinks wrong)
sum=0;
for(int i=0;i<n;i++)
{
sum+=func(a+(b-a)*((double)i+1.0)/(double)n);
//return sum*(b-a)/(double)n;
}
RichEdit2->Lines->Add(sum);
}

-3

Решение

1. Интеграл — это площадь под кривой. Вы должны умножить результат на h:

sum+=func(a+(b-a) * i / n) * h;

2. Вам нужно сделать код интеграции независимым от интегрируемой функции. Например, используя наследование:

class Func
{
public:
virtual double compute(double x) const = 0;
~Func() {};
};

class Sin : public Func
{
public:
virtual double compute(double x) const { return sin(x); };
};

class Cos : public Func
{
public:
virtual double compute(double x) const { return cos(x); };
};

/*Add other functions defs*/const Func& getFunc(int idx)
{
switch (idx)
{
case 0:
{
static Sin f;
return f;
}
case 1:
{
static Cos f;
return f;
}
/*Add other functions cases*/

default:
{
// Input Error  handling
static Sin f;
return f;
}
}
}

//-------------------------------------//
//-------------------------------------//
const Func& f = getFunc(ComboBox1->ItemIndex);

for (int i = 0; i<n; i++)
{
s = s + 0.5*(f.compute(x) + f.compute(x + h))*h;
x = x + h;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]