AllowRotation and size_t
This commit is contained in:
committed by
PaddleStroke
parent
fe99ad2593
commit
85557e1fa4
@@ -36,20 +36,20 @@ void MbD::GeneralSpline::arguments(Symsptr args)
|
||||
{
|
||||
auto array = args->getTerms();
|
||||
auto& arg = array->at(0);
|
||||
int order = (int)array->at(1)->getValue();
|
||||
int n = ((int)array->size() - 2) / 2;
|
||||
size_t order = array->at(1)->getValue();
|
||||
size_t n = (array->size() - 2) / 2;
|
||||
auto xarray = std::make_shared<std::vector<double>>(n);
|
||||
auto yarray = std::make_shared<std::vector<double>>(n);
|
||||
for (int i = 0; i < n; i++)
|
||||
for (size_t i = 0; i < n; i++)
|
||||
{
|
||||
int ii = 2 * ((int)i + 1);
|
||||
size_t ii = 2 * (i + 1);
|
||||
xarray->at(i) = array->at(ii)->getValue();
|
||||
yarray->at(i) = array->at(ii + 1)->getValue();
|
||||
}
|
||||
initxdegreexsys(arg, order, xarray, yarray);
|
||||
}
|
||||
|
||||
void MbD::GeneralSpline::initxdegreexsys(Symsptr arg, int order, std::shared_ptr<std::vector<double>> xarr, std::shared_ptr<std::vector<double>> yarr)
|
||||
void MbD::GeneralSpline::initxdegreexsys(Symsptr arg, size_t order, std::shared_ptr<std::vector<double>> xarr, std::shared_ptr<std::vector<double>> yarr)
|
||||
{
|
||||
xx = arg;
|
||||
degree = order;
|
||||
@@ -63,41 +63,41 @@ void MbD::GeneralSpline::computeDerivatives()
|
||||
{
|
||||
//"See derivation in MbDTheory 9spline.fodt."
|
||||
if (degree == 0) throw std::runtime_error("ToDo: Use ZeroDegreeSpline");
|
||||
auto n = (int)xs->size();
|
||||
auto n = xs->size();
|
||||
auto p = degree;
|
||||
auto np = n * p;
|
||||
auto matrix = std::make_shared<SparseMatrix<double>>(np, np);
|
||||
auto bvector = std::make_shared<FullColumn<double>>(np, 0.0);
|
||||
auto hs = std::make_shared<FullColumn<double>>(n - 1);
|
||||
double hmax = 0.0;
|
||||
for (int i = 0; i < n - 1; i++)
|
||||
for (size_t i = 0; i < n - 1; i++)
|
||||
{
|
||||
double h = xs->at((int)i + 1) - xs->at(i);
|
||||
double h = xs->at(i + 1) - xs->at(i);
|
||||
hmax = std::max(hmax, std::abs(h));
|
||||
hs->atiput(i, h);
|
||||
}
|
||||
for (int i = 0; i < n - 1; i++)
|
||||
for (size_t i = 0; i < n - 1; i++)
|
||||
{
|
||||
auto offset = i * p;
|
||||
double hbar = hs->at(i) / hmax;
|
||||
for (int j = 1; j < p; j++)
|
||||
for (size_t j = 1; j < p; j++)
|
||||
{
|
||||
matrix->atijput(offset + j, offset + j - 1, 1.0);
|
||||
matrix->atijput(offset + j, offset + j - 1 + p, -1.0);
|
||||
}
|
||||
double dum = 1.0;
|
||||
for (int j = 0; j < p; j++)
|
||||
for (size_t j = 0; j < p; j++)
|
||||
{
|
||||
dum = dum * hbar / (j + 1);
|
||||
for (int k = j; k < p; k++)
|
||||
for (size_t k = j; k < p; k++)
|
||||
{
|
||||
matrix->atijput(offset + k - j, offset + k, dum);
|
||||
}
|
||||
}
|
||||
bvector->atiput(offset, ys->at((int)i + 1) - ys->at(i));
|
||||
bvector->atiput(offset, ys->at(i + 1) - ys->at(i));
|
||||
}
|
||||
if (isCyclic()) {
|
||||
for (int j = 1; j < p + 1; j++)
|
||||
for (size_t j = 1; j < p + 1; j++)
|
||||
{
|
||||
matrix->atijput(np - j, np - j, 1.0);
|
||||
matrix->atijput(np - j, p - j, -1.0);
|
||||
@@ -121,15 +121,15 @@ void MbD::GeneralSpline::computeDerivatives()
|
||||
auto derivsVector = solver->solvewithsaveOriginal(matrix, bvector, false);
|
||||
derivs = std::make_shared<FullMatrix<double>>(n, p);
|
||||
auto hmaxpowers = std::make_shared<FullColumn<double>>(p);
|
||||
for (int j = 0; j < p; j++)
|
||||
for (size_t j = 0; j < p; j++)
|
||||
{
|
||||
hmaxpowers->atiput(j, std::pow(hmax, j + 1));
|
||||
}
|
||||
for (int i = 0; i < n; i++)
|
||||
for (size_t i = 0; i < n; i++)
|
||||
{
|
||||
auto& derivsi = derivs->at(i);
|
||||
derivsi->equalArrayAt(derivsVector, (i - 1) * p + 1);
|
||||
for (int j = 0; j < p; j++)
|
||||
for (size_t j = 0; j < p; j++)
|
||||
{
|
||||
derivsi->atiput(j, derivsi->at(j) / hmaxpowers->at(j));
|
||||
}
|
||||
@@ -141,7 +141,7 @@ bool MbD::GeneralSpline::isCyclic()
|
||||
return (ys->size() > 3) && (ys->front() == ys->back());
|
||||
}
|
||||
|
||||
double MbD::GeneralSpline::derivativeAt(int n, double xxx)
|
||||
double MbD::GeneralSpline::derivativeAt(size_t n, double xxx)
|
||||
{
|
||||
//"dydx(x) := dydxi + d2ydx2i*hi + d3ydx3i*hi^2/2! +"
|
||||
//"d2ydx2(x) := d2ydx2i + d3ydx3i*hi + d4ydx4i*hi^2/2! +"
|
||||
@@ -149,11 +149,11 @@ double MbD::GeneralSpline::derivativeAt(int n, double xxx)
|
||||
calcIndexAndDeltaFor(xxx);
|
||||
auto& derivsi = derivs->at(index);
|
||||
double sum = 0.0;
|
||||
for (int j = degree; j >= n + 1; j--)
|
||||
for (int j = degree; j >= n + 1; j--) //Use int because of decrement
|
||||
{
|
||||
sum = (sum + derivsi->at((int)j - 1)) * delta / (j - n);
|
||||
sum = (sum + derivsi->at(j - 1)) * delta / (j - n);
|
||||
}
|
||||
return derivsi->at((int)n - 1) + sum;
|
||||
return derivsi->at(n - 1) + sum;
|
||||
}
|
||||
|
||||
void MbD::GeneralSpline::calcIndexAndDeltaFor(double xxx)
|
||||
@@ -185,7 +185,7 @@ void MbD::GeneralSpline::calcNonCyclicIndexAndDelta()
|
||||
}
|
||||
else {
|
||||
if (xvalue >= xLast) {
|
||||
index = (int)xs->size() - 1;
|
||||
index = xs->size() - 1;
|
||||
delta = xvalue - xLast;
|
||||
}
|
||||
else {
|
||||
@@ -196,20 +196,20 @@ void MbD::GeneralSpline::calcNonCyclicIndexAndDelta()
|
||||
|
||||
void MbD::GeneralSpline::calcIndexAndDelta()
|
||||
{
|
||||
if (!(index < (int)xs->size() - 1) || !(xs->at(index) <= xvalue) || !(xvalue < xs->at((int)index + 1))) {
|
||||
searchIndexFromto(0, (int)xs->size()); //Using range.
|
||||
if (!(index < xs->size() - 1) || !(xs->at(index) <= xvalue) || !(xvalue < xs->at(index + 1))) {
|
||||
searchIndexFromto(0, xs->size()); //Using range.
|
||||
}
|
||||
delta = xvalue - xs->at(index);
|
||||
}
|
||||
|
||||
void MbD::GeneralSpline::searchIndexFromto(int first, int last)
|
||||
void MbD::GeneralSpline::searchIndexFromto(size_t first, size_t last)
|
||||
{
|
||||
//"Assume xs(first) <= xvalue < xs(last)."
|
||||
if (first + 1 == last) {
|
||||
index = first;
|
||||
}
|
||||
else {
|
||||
auto middle = (int)std::floor((first + last) / 2);
|
||||
auto middle = std::floor((first + last) / 2);
|
||||
if (xvalue < xs->at(middle)) {
|
||||
searchIndexFromto(first, middle);
|
||||
}
|
||||
@@ -231,9 +231,9 @@ double MbD::GeneralSpline::y(double xxx)
|
||||
calcIndexAndDeltaFor(xxx);
|
||||
auto& derivsi = derivs->at(index);
|
||||
double sum = 0.0;
|
||||
for (int j = degree; j >= 1; j--)
|
||||
for (int j = degree; j >= 1; j--) //Use int because of decrement
|
||||
{
|
||||
sum = (sum + derivsi->at((int)j - 1)) * delta / j;
|
||||
sum = (sum + derivsi->at(j - 1)) * delta / j;
|
||||
}
|
||||
return ys->at(index) + sum;
|
||||
}
|
||||
@@ -245,14 +245,14 @@ std::ostream& MbD::GeneralSpline::printOn(std::ostream& s) const
|
||||
s << degree << ", " << std::endl;
|
||||
s << "xs{";
|
||||
s << xs->at(0);
|
||||
for (int i = 1; i < (int)xs->size(); i++)
|
||||
for (size_t i = 1; i < xs->size(); i++)
|
||||
{
|
||||
s << ", " << xs->at(i);
|
||||
}
|
||||
s << "}, " << std::endl;
|
||||
s << "ys{";
|
||||
s << ys->at(0);
|
||||
for (int i = 1; i < (int)ys->size(); i++)
|
||||
for (size_t i = 1; i < ys->size(); i++)
|
||||
{
|
||||
s << ", " << ys->at(i);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user