libStatGen Software 1
VectorFunc Class Reference
Collaboration diagram for VectorFunc:

Public Member Functions

 VectorFunc (double(*func)(Vector &))
 
virtual double Evaluate (Vector &v)
 
virtual void Derivative (Vector &point, Vector &d, double delta=1.0)
 

Public Attributes

double dfmin
 
Vector dpmin
 

Detailed Description

Definition at line 281 of file MathVector.h.

Constructor & Destructor Documentation

◆ VectorFunc() [1/2]

VectorFunc::VectorFunc ( )

Definition at line 465 of file MathVector.cpp.

466{
467 f = NULL;
468}

◆ VectorFunc() [2/2]

VectorFunc::VectorFunc ( double(*)(Vector &)  func)

Definition at line 470 of file MathVector.cpp.

471{
472 f = func;
473}

◆ ~VectorFunc()

virtual VectorFunc::~VectorFunc ( )
inlinevirtual

Definition at line 296 of file MathVector.h.

296{ }

Member Function Documentation

◆ Derivative()

void VectorFunc::Derivative ( Vector point,
Vector d,
double  delta = 1.0 
)
virtual

Definition at line 488 of file MathVector.cpp.

489{
490 double a[MAXROUNDS][MAXROUNDS];
491
492 // Calculate derivatives along each direction ...
493 for (int k = 0; k < x.dim; k++)
494 {
495 double left, right;
496 double save_x = x[k];
497 double h = h_start;
498
499 // Evaluate function to the left of x along direction k
500 x[k] = save_x - h;
501 left = Evaluate(x);
502
503 // Initialize or update dfmin if appropriate...
504 if (k == 0 || left < dfmin)
505 dfmin = left, dpmin = x;
506
507 // Evaluate function to the right of x along direction k
508 x[k] = save_x + h;
509 right = Evaluate(x);
510
511 // Update dfmin
512 if (right < dfmin)
513 dfmin = left, dpmin = x;
514
515 // Initial crude estimate
516 a[0][0] = (right - left) / (2.0 * h);
517
518 // Initial guess of error is large
519 double err = 1e30;
520
521 // At each round, update Neville tableau with smaller stepsize and higher
522 // order extrapolation ...
523 for (int i = 1; i < MAXROUNDS; i++)
524 {
525 // Decrease h
526 h *= SQRT_HALF;
527
528 // Re-evaluate function and update dfmin as required
529 x[k] = save_x - h;
530 left = Evaluate(x);
531 if (left < dfmin) dfmin = left, dpmin = x;
532 x[k] = save_x + h;
533 right = Evaluate(x);
534 if (right < dfmin) dfmin = right, dpmin = x;
535
536 // Improved estimate of derivative
537 a[0][i] = (right - left) / (2.0 * h);
538
539 // Calculate extrapolations of various orders ...
540 double factor = TWO;
541
542 for (int j = 1; j <= i; j++)
543 {
544 a[j][i] = (a[j-1][i] * factor - a[j-1][i-1])/(factor - 1.0);
545
546 factor *= TWO;
547
548 double error = max(fabs(a[j][i] - a[j-1][i]), fabs(a[j][i] - a[j-1][i-1]));
549
550 // Did we improve solution?
551 if (error < err)
552 {
553 err = error;
554 d[k] = a[j][i];
555 }
556 }
557
558 // Stop if solution is deteriorating ...
559 if (fabs(a[i][i] - a[i-1][i-1]) >= 2.0 * err)
560 {
561 x[k] = save_x;
562 break;
563 }
564 }
565
566 x[k] = save_x;
567 }
568}

◆ Evaluate()

double VectorFunc::Evaluate ( Vector v)
virtual

Definition at line 475 of file MathVector.cpp.

476{
477 return f(v);
478}

Member Data Documentation

◆ dfmin

double VectorFunc::dfmin

Definition at line 306 of file MathVector.h.

◆ dpmin

Vector VectorFunc::dpmin

Definition at line 307 of file MathVector.h.


The documentation for this class was generated from the following files: