Skip to content

Commit

Permalink
Merge pull request #11 from ermolaevv/korovin
Browse files Browse the repository at this point in the history
Added a definite integral
  • Loading branch information
ermolaevv authored Mar 17, 2024
2 parents 946f73c + c9314d2 commit 14f6f63
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 46 deletions.
31 changes: 16 additions & 15 deletions polinom/include/Monom.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ class TMonom : public TDatValue {
TMonom operator*(const TMonom& mon);
TMonom& operator*=(const TMonom& mon);

TMonom& operator=(const TMonom& tm);

TMonom Integrate_Monom(int variable) const;
TMonom Differentiation_Monom(int variable) const;
TMonom& operator=(const TMonom& tm);

TMonom Integrate_Monom(int variable) const;
TMonom Differentiation_Monom(int variable) const;


bool operator==(const TMonom& tm) const;
Expand Down Expand Up @@ -353,25 +353,26 @@ bool TMonom::operator==(const TMonom& mon) const
if (!std::equal(Deg, Deg + CountDeg, mon.Deg))
return false;
return true;
}

}

TMonom TMonom::Integrate_Monom(int variable) const {
if (variable >= CountDeg) { throw std::invalid_argument("Incorrect variable number"); }

double new_Coeff = Coeff / (Deg[variable] + 1);

int* new_Deg = new int[CountDeg];
if (variable >= CountDeg) { throw std::invalid_argument("Incorrect variable number"); }

double new_Coeff = Coeff / (Deg[variable] + 1);

int* new_Deg = new int[CountDeg];
for (int i = 0; i < CountDeg; i++) {
new_Deg[i] = Deg[i];
}
new_Deg[variable]++;
}
new_Deg[variable]++;
return TMonom(new_Coeff, CountDeg, new_Deg);
}


TMonom TMonom::Differentiation_Monom(int variable) const {
if (variable >= CountDeg) { throw std::invalid_argument("Incorrect variable number"); }

double new_Coeff = Coeff * Deg[variable];

int* new_Deg = new int[CountDeg];
for (int i = 0; i < CountDeg; i++) {
new_Deg[i] = Deg[i];
Expand All @@ -382,4 +383,4 @@ TMonom TMonom::Differentiation_Monom(int variable) const {
}


#endif
#endif
16 changes: 14 additions & 2 deletions polinom/include/Polinom.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class TPolinom : public THeadRing<TMonom> {

TPolinom& operator=(const TPolinom& q); // присваивание
bool operator==(const TPolinom& other) const;
double CalculateDefiniteIntegral(int variable, double* start, double* end) const;

std::string ToString(void);
friend std::ostream& operator<<(std::ostream& ostr, TPolinom& q);
Expand Down Expand Up @@ -272,8 +273,13 @@ double TPolinom::Calculate(const int countVar, const double* value)
std::vector<std::string> valNames = expr.GetOperands();

std::map<std::string, double> op;
for (int i = 0; i < this->countVar; i++) {
op.insert(std::pair<std::string, double>(valNames[i], value[i]));
int i = 0;
for (auto valName : valNames) {
if (i >= countVar)
break;

op.insert(std::pair<std::string, double>(valName, value[i]));
i++;
}

return expr.Calculate(op);
Expand Down Expand Up @@ -366,4 +372,10 @@ TPolinom TPolinom::Differentiation(int variable) const {
return res;
}

double TPolinom::CalculateDefiniteIntegral(int variable, double* start, double* end) const {
TPolinom integrated_P = this->Integrate(variable);
double end_value = integrated_P.Calculate(countVar, end);
double start_value = integrated_P.Calculate(countVar, start);
return end_value - start_value;
}
#endif
63 changes: 34 additions & 29 deletions polinom/test/test_polinom.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include <gtest/gtest.h>
#include "Polinom.h"
using namespace std;

const double EPSILON = 1e-6;

const double EPSILON = 1e-6;

TEST(TPolinom, test1)
{
Expand Down Expand Up @@ -104,7 +104,7 @@ TEST(TPolinom, test4)
res.AddMonom(TMonom(-6, 3, deg2));

ASSERT_EQ(res, P + Q);
}
}

TEST(TPolinom, test5)
{
Expand All @@ -116,12 +116,12 @@ TEST(TPolinom, test5)

P.AddMonom(TMonom(3, 3, deg1));
P.AddMonom(TMonom(-5, 3, deg2));
P.AddMonom(TMonom(7, 3, deg3));

P.AddMonom(TMonom(7, 3, deg3));

Q = P * -1.0;

ASSERT_EQ(res, P + Q);
}
}

TEST(TPolinom, Calculate_test)
{
Expand All @@ -133,37 +133,42 @@ TEST(TPolinom, Calculate_test)

P.AddMonom(TMonom(3, 3, deg1));
P.AddMonom(TMonom(-5, 3, deg2));
P.AddMonom(TMonom(7, 3, deg3));

P.AddMonom(TMonom(7, 3, deg3));

double values[] = { 2, 3, 4 };
ASSERT_EQ(168, round(P.Calculate(3, values) * 100) / 100);
}


TEST(TPolinom, IntegrateTest) {
int deg[] = { 2, 1, 3 };
TMonom monom(5.0, 3, deg);

TMonom integrated_monom = monom.Integrate_Monom(1);
}

double expected_coeff = 5.0 / 2;
int expected_deg[] = { 2, 2, 3 };
TMonom expected_monom(expected_coeff, 3, expected_deg);

ASSERT_EQ(integrated_monom, expected_monom);
TEST(TPolinom, IntegrateTest) {
TPolinom P;
int deg1[] = { 3, 1, 0 };
int deg2[] = { 1, 2, 2 };
P.AddMonom(TMonom(4, 3, deg1)); // 4*x0^3*x1
P.AddMonom(TMonom(-3, 3, deg2)); // -3*x0*x1^2*x2^2
TPolinom integrated_P = P.Integrate(1);
EXPECT_EQ("2*x0^3*x1^2 - 1*x0*x1^3*x2^2", integrated_P.ToString());
}


TEST(TPolinomTest, DifferentiationTest) {
int deg[] = { 2, 1, 3 };
TMonom monom(5.0, 3, deg);
TEST(TPolinom, DifferentiationTest) {
TPolinom P;
int deg1[] = { 3, 1, 0 };
int deg2[] = { 1, 2, 2 };
P.AddMonom(TMonom(4, 3, deg1)); // 4*x0^3*x1
P.AddMonom(TMonom(-3, 3, deg2)); // -3*x0*x1^2*x2^2
TPolinom diff_P = P.Differentiation(1);
EXPECT_EQ("4*x0^3 - 6*x0*x1*x2^2", diff_P.ToString());
}

TMonom diff_monom = monom.Differentiation_Monom(1);

double expected_coeff = 5.0 * 1;
int expected_deg[] = { 2, 0, 3 };
TMonom expected_monom(expected_coeff, 3, expected_deg);

ASSERT_EQ(diff_monom, expected_monom);
TEST(TPolinom, CalculateDefiniteIntegralTest) {
TPolinom P(3);
int deg[] = { 2, 0, 0 };
P.AddMonom(TMonom(3, 3, deg));
double start[] = { 0, 0, 0 };
double end[] = { 1, 0, 0 };
double integral = P.CalculateDefiniteIntegral(0, start, end);
EXPECT_DOUBLE_EQ(1.0, integral);
}

0 comments on commit 14f6f63

Please sign in to comment.