Beispiel #1
0
bool OjaData::derivative(const Point& x,const Point& direction,double& Dpos
  ,double& Dneg) const
{
    Point d=direction;
    d.normalize();
    
	Index I(dim(),size());
	Hyperplane H;
    double D; // Apumuuttuja yhden termi laskemiseen
    double sum=0.0; // Summa positiiviseen suuntaan
	double sum_=0.0; // Summa negatiiviseen suuntaan
    double k=1.0 / double(fact(dim()));
    double sgn;

    for(int i=0; i<hyperplanes(); i++)
    {
		if(planes)
			H=hyperplane(i);
		else
		{
			H.get(*this,I);
			I++;
		}
		
		H.normalize();
		D = k * (H|d);       
		sgn = H.side(x);
		if(sgn > 0)              // Piste ei ole hypertasolla
			sum += D, sum_ -= D;
		else if (sgn < 0)
			sum -= D, sum_ += D;
		else                     // Piste on hypertasolla
			sum += fabs(D), sum_ += fabs(D);
    }

    Dpos = sum;
    Dneg = sum_;
    
    return Dpos >= 0.0 && Dneg >= 0.0;
}