moved attractorkernels to headers
This commit is contained in:
parent
1c5e58559d
commit
ac0cb177a9
10 changed files with 115 additions and 251 deletions
|
@ -1,43 +0,0 @@
|
||||||
//
|
|
||||||
// $filename
|
|
||||||
// $projectname
|
|
||||||
//
|
|
||||||
// Created by Joshua moerman on $TODAY.
|
|
||||||
// Copyright 2010 Joshua Moerman. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "Logistic.hpp"
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark ctors
|
|
||||||
|
|
||||||
Logistic::Logistic():
|
|
||||||
AttractorKernel(3, 3) {
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
Logistic::Logistic(const unsigned int dimension):
|
|
||||||
AttractorKernel(dimension, dimension) {
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Logistic::init() {
|
|
||||||
// setting some starting values
|
|
||||||
std::fill_n(vectorOld, dimension, 0.5);
|
|
||||||
std::fill_n(vectorNew, dimension, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark attractor
|
|
||||||
|
|
||||||
void Logistic::operator()() {
|
|
||||||
std::swap(vectorNew, vectorOld);
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < dimension; i++) {
|
|
||||||
vectorNew[i] = parameters[i]*vectorOld[i]*(1.0 - vectorOld[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -3,24 +3,42 @@
|
||||||
|
|
||||||
#include "../AttractorKernel.hpp"
|
#include "../AttractorKernel.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
class Logistic : public AttractorKernel {
|
class Logistic : public AttractorKernel {
|
||||||
private:
|
private:
|
||||||
|
void init() {
|
||||||
void init();
|
// setting some starting values
|
||||||
|
std::fill_n(vectorOld, dimension, 0.5);
|
||||||
public:
|
std::fill_n(vectorNew, dimension, 0.5);
|
||||||
|
|
||||||
Logistic();
|
|
||||||
Logistic(const unsigned int dimension);
|
|
||||||
|
|
||||||
virtual void operator()();
|
|
||||||
|
|
||||||
virtual void generate_random_parameters(){
|
|
||||||
for(unsigned int i = 0; i < numberOfParameters; ++i){
|
|
||||||
parameters[i] = rand() / double(RAND_MAX) + 3.0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
Logistic():
|
||||||
|
AttractorKernel(3, 3) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
Logistic(const unsigned int dimension):
|
||||||
|
AttractorKernel(dimension, dimension) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void generate_random_parameters() {
|
||||||
|
for(unsigned int i = 0; i < numberOfParameters; ++i) {
|
||||||
|
parameters[i] = rand() / double(RAND_MAX) + 3.0;
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void operator()() {
|
||||||
|
std::swap(vectorNew, vectorOld);
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < dimension; i++) {
|
||||||
|
vectorNew[i] = parameters[i]*vectorOld[i]*(1.0 - vectorOld[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LOGISTIC_HPP
|
#endif // LOGISTIC_HPP
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
#include "Lorenz3D.hpp"
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark ctors
|
|
||||||
|
|
||||||
Lorenz3D::Lorenz3D():
|
|
||||||
AttractorKernel(3, 4) {
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Lorenz3D::init() {
|
|
||||||
// setting some starting values
|
|
||||||
std::fill_n(vectorOld, dimension, 1.0);
|
|
||||||
std::fill_n(vectorNew, dimension, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark attractor
|
|
||||||
|
|
||||||
void Lorenz3D::operator()() {
|
|
||||||
std::swap(vectorNew, vectorOld);
|
|
||||||
|
|
||||||
vectorNew[0] = vectorOld[0] + parameters[0] * parameters[1] * (vectorOld[1] - vectorOld[0]);
|
|
||||||
vectorNew[1] = vectorOld[1] + parameters[0] * (vectorOld[0] * (parameters[2] - vectorOld[2]) - vectorOld[1]);
|
|
||||||
vectorNew[2] = vectorOld[2] + parameters[0] * (vectorOld[0] * vectorOld[1] - parameters[3] * vectorOld[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
4D:
|
|
||||||
new_point[0] = point[0] + param[0] * param[1] * (point[1] - point[0]);
|
|
||||||
new_point[1] = point[1] + param[0] * (point[0] * (param[2] - point[2]) - point[1] + point[3]);
|
|
||||||
new_point[2] = point[2] + param[0] * (point[0] * point[1] - param[3] * point[2]);
|
|
||||||
new_point[3] = point[3] - param[0] * param[4] * point[0];
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
|
|
|
@ -5,20 +5,31 @@
|
||||||
|
|
||||||
class Lorenz3D : public AttractorKernel {
|
class Lorenz3D : public AttractorKernel {
|
||||||
private:
|
private:
|
||||||
|
void init() {
|
||||||
void init();
|
std::fill_n(vectorOld, dimension, 1.0);
|
||||||
|
std::fill_n(vectorNew, dimension, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Lorenz3D():
|
||||||
|
AttractorKernel(3, 4) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
Lorenz3D();
|
virtual void generate_random_parameters() {
|
||||||
|
|
||||||
virtual void operator()();
|
|
||||||
|
|
||||||
virtual void generate_random_parameters(){
|
|
||||||
parameters[0] = rand() / double(RAND_MAX) * 0.01;
|
parameters[0] = rand() / double(RAND_MAX) * 0.01;
|
||||||
parameters[1] = rand() / double(RAND_MAX) * 10.0 + 23.0;
|
parameters[1] = rand() / double(RAND_MAX) * 10.0 + 23.0;
|
||||||
parameters[2] = rand() / double(RAND_MAX) * 4.0 + 8.0;
|
parameters[2] = rand() / double(RAND_MAX) * 4.0 + 8.0;
|
||||||
parameters[3] = rand() / double(RAND_MAX) * 1.5 + 2.0;
|
parameters[3] = rand() / double(RAND_MAX) * 1.5 + 2.0;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void operator()() {
|
||||||
|
std::swap(vectorNew, vectorOld);
|
||||||
|
|
||||||
|
vectorNew[0] = vectorOld[0] + parameters[0] * parameters[1] * (vectorOld[1] - vectorOld[0]);
|
||||||
|
vectorNew[1] = vectorOld[1] + parameters[0] * (vectorOld[0] * (parameters[2] - vectorOld[2]) - vectorOld[1]);
|
||||||
|
vectorNew[2] = vectorOld[2] + parameters[0] * (vectorOld[0] * vectorOld[1] - parameters[3] * vectorOld[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
//
|
|
||||||
// $filename
|
|
||||||
// $projectname
|
|
||||||
//
|
|
||||||
// Created by Joshua moerman on $TODAY.
|
|
||||||
// Copyright 2010 Joshua Moerman. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "Polynomial.hpp"
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int calculateNumberOfParameters(const unsigned int dimension, const unsigned int orde) {
|
|
||||||
double n_coef = orde + 1;
|
|
||||||
for(unsigned int i = 2; i <= dimension; i++) {
|
|
||||||
n_coef = n_coef*(orde + i)/(i - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const unsigned int output = (unsigned int) n_coef;
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark ctors
|
|
||||||
|
|
||||||
Polynomial::Polynomial():
|
|
||||||
AttractorKernel(3, calculateNumberOfParameters(3, 2)), orde(2) {}
|
|
||||||
|
|
||||||
Polynomial::Polynomial(const unsigned int dimension, const unsigned int orde):
|
|
||||||
AttractorKernel(dimension, calculateNumberOfParameters(dimension, orde)), orde(orde) {}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark attractor
|
|
||||||
|
|
||||||
void Polynomial::operator()() {
|
|
||||||
std::swap(vectorNew, vectorOld);
|
|
||||||
|
|
||||||
unsigned int m = 0;
|
|
||||||
for(unsigned int i = 0; i < dimension; i++) {
|
|
||||||
|
|
||||||
vectorNew[i] = parameters[m];
|
|
||||||
m++;
|
|
||||||
recur(i, 0, 1, m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Polynomial::recur(unsigned int curr_dimension, unsigned int prev_i, unsigned int n, unsigned int& m, double prev_product) {
|
|
||||||
double product;
|
|
||||||
for(unsigned int i = prev_i; i < dimension; i++) {
|
|
||||||
|
|
||||||
product = prev_product * vectorOld[i];
|
|
||||||
vectorNew[curr_dimension] += parameters[m] * product;
|
|
||||||
m++;
|
|
||||||
if(n < orde) {
|
|
||||||
recur(curr_dimension, i, n+1, m, product);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,20 +3,52 @@
|
||||||
|
|
||||||
#include "../AttractorKernel.hpp"
|
#include "../AttractorKernel.hpp"
|
||||||
|
|
||||||
|
unsigned int calculateNumberOfParameters(const unsigned int dimension, const unsigned int orde) {
|
||||||
|
double n_coef = orde + 1;
|
||||||
|
for(unsigned int i = 2; i <= dimension; i++) {
|
||||||
|
n_coef = n_coef*(orde + i)/(i - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned int output = (unsigned int) n_coef;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Polynomial : public AttractorKernel {
|
class Polynomial : public AttractorKernel {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
unsigned int orde;
|
unsigned int orde;
|
||||||
|
|
||||||
void recur(unsigned int curr_dimension, unsigned int prev_i, unsigned int n, unsigned int& m, double prev_product=1.0);
|
void recur(unsigned int curr_dimension, unsigned int prev_i, unsigned int n, unsigned int& m, double prev_product=1.0) {
|
||||||
|
double product;
|
||||||
|
for(unsigned int i = prev_i; i < dimension; i++) {
|
||||||
|
|
||||||
|
product = prev_product * vectorOld[i];
|
||||||
|
vectorNew[curr_dimension] += parameters[m] * product;
|
||||||
|
m++;
|
||||||
|
if(n < orde) {
|
||||||
|
recur(curr_dimension, i, n+1, m, product);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Polynomial():
|
||||||
|
AttractorKernel(3, calculateNumberOfParameters(3, 2)), orde(2) {}
|
||||||
|
|
||||||
Polynomial();
|
Polynomial(const unsigned int dimensions, const unsigned int orde):
|
||||||
Polynomial(const unsigned int dimensions, const unsigned int orde);
|
AttractorKernel(dimension, calculateNumberOfParameters(dimension, orde)), orde(orde) {}
|
||||||
|
|
||||||
virtual void operator()();
|
virtual void operator()() {
|
||||||
|
std::swap(vectorNew, vectorOld);
|
||||||
|
|
||||||
|
unsigned int m = 0;
|
||||||
|
for(unsigned int i = 0; i < dimension; i++) {
|
||||||
|
|
||||||
|
vectorNew[i] = parameters[m];
|
||||||
|
m++;
|
||||||
|
recur(i, 0, 1, m);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POLYNOMIAL_HPP
|
#endif // POLYNOMIAL_HPP
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
//
|
|
||||||
// $filename
|
|
||||||
// $projectname
|
|
||||||
//
|
|
||||||
// Created by Joshua moerman on $TODAY.
|
|
||||||
// Copyright 2010 Joshua Moerman. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "PolynomialA3D.hpp"
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark ctors
|
|
||||||
|
|
||||||
PolynomialA3D::PolynomialA3D():
|
|
||||||
AttractorKernel(3, 3) {}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark attractor
|
|
||||||
|
|
||||||
void PolynomialA3D::operator()() {
|
|
||||||
std::swap(vectorNew, vectorOld);
|
|
||||||
|
|
||||||
vectorNew[0] = parameters[0] + vectorOld[1] - vectorOld[1]*vectorOld[2];
|
|
||||||
vectorNew[1] = parameters[1] + vectorOld[2] - vectorOld[2]*vectorOld[0];
|
|
||||||
vectorNew[2] = parameters[2] + vectorOld[0] - vectorOld[0]*vectorOld[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
N dimensional:
|
|
||||||
for ( unsigned int i = 0; i < dim; i++ ) {
|
|
||||||
new_point[i] = param[i] + point[(i+1) % dim] - point[(i+1) % dim]*point[(i+2) % dim];
|
|
||||||
}
|
|
||||||
*/
|
|
|
@ -4,14 +4,17 @@
|
||||||
#include "../AttractorKernel.hpp"
|
#include "../AttractorKernel.hpp"
|
||||||
|
|
||||||
class PolynomialA3D : public AttractorKernel {
|
class PolynomialA3D : public AttractorKernel {
|
||||||
private:
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
PolynomialA3D():
|
||||||
|
AttractorKernel(3, 3) {}
|
||||||
|
|
||||||
PolynomialA3D();
|
virtual void operator()() {
|
||||||
|
std::swap(vectorNew, vectorOld);
|
||||||
virtual void operator()();
|
|
||||||
|
|
||||||
|
vectorNew[0] = parameters[0] + vectorOld[1] - vectorOld[1]*vectorOld[2];
|
||||||
|
vectorNew[1] = parameters[1] + vectorOld[2] - vectorOld[2]*vectorOld[0];
|
||||||
|
vectorNew[2] = parameters[2] + vectorOld[0] - vectorOld[0]*vectorOld[1];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POLYNOMIALA3D_HPP
|
#endif // POLYNOMIALA3D_HPP
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
#include "Unravel3D.hpp"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark ctors
|
|
||||||
|
|
||||||
Unravel3D::Unravel3D():
|
|
||||||
AttractorKernel(3, 7) {}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark attractor
|
|
||||||
|
|
||||||
void Unravel3D::operator()() {
|
|
||||||
std::swap(vectorNew, vectorOld);
|
|
||||||
|
|
||||||
vectorNew[0] = parameters[0]*(vectorOld[2] + parameters[1]);
|
|
||||||
vectorNew[1] = parameters[2]*(vectorOld[0] + parameters[3]);
|
|
||||||
vectorNew[2] = parameters[4]*(vectorOld[1] + parameters[5]);
|
|
||||||
|
|
||||||
const double dist = vectorNew[0]*vectorNew[0] + vectorNew[1]*vectorNew[1] + vectorNew[2]*vectorNew[2];
|
|
||||||
|
|
||||||
if(dist > parameters[6]*parameters[6]) {
|
|
||||||
const double sqrtDist = std::sqrt(dist);
|
|
||||||
const double p = 1.0 - parameters[6] * (static_cast<int>(sqrtDist / parameters[6]) + 1.0) / sqrtDist;
|
|
||||||
vectorNew[0] *= p;
|
|
||||||
vectorNew[1] *= p;
|
|
||||||
vectorNew[2] *= p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -3,13 +3,30 @@
|
||||||
|
|
||||||
#include "../AttractorKernel.hpp"
|
#include "../AttractorKernel.hpp"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
class Unravel3D : public AttractorKernel {
|
class Unravel3D : public AttractorKernel {
|
||||||
public:
|
public:
|
||||||
|
Unravel3D():
|
||||||
|
AttractorKernel(3, 7) {}
|
||||||
|
|
||||||
Unravel3D();
|
virtual void operator()() {
|
||||||
Unravel3D(const unsigned int dimensions);
|
std::swap(vectorNew, vectorOld);
|
||||||
|
|
||||||
virtual void operator()();
|
vectorNew[0] = parameters[0]*(vectorOld[2] + parameters[1]);
|
||||||
|
vectorNew[1] = parameters[2]*(vectorOld[0] + parameters[3]);
|
||||||
|
vectorNew[2] = parameters[4]*(vectorOld[1] + parameters[5]);
|
||||||
|
|
||||||
|
const double dist = vectorNew[0]*vectorNew[0] + vectorNew[1]*vectorNew[1] + vectorNew[2]*vectorNew[2];
|
||||||
|
|
||||||
|
if(dist > parameters[6]*parameters[6]) {
|
||||||
|
const double sqrtDist = std::sqrt(dist);
|
||||||
|
const double p = 1.0 - parameters[6] * (static_cast<int>(sqrtDist / parameters[6]) + 1.0) / sqrtDist;
|
||||||
|
vectorNew[0] *= p;
|
||||||
|
vectorNew[1] *= p;
|
||||||
|
vectorNew[2] *= p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in a new issue