|
From: Kim K. T. <kue...@vo...> - 2011-03-27 19:37:26
|
Hi Jason,
can you provide a standalone example the next time?
Am 25.03.2011 05:09, schrieb 蔡宗儒-風險管理處-銀行:
> Hello,
> I'm the user of QuantLib.
> I have some question about optimization.
> I use the optimization method *_LevenbergMarquardt_*and the cost
> function *_OneDimensionalPolynomialDegreeN_*in optimizers.cpp
> I solve the following eqtions seperately(I did not solve together)
> E1 = 1+x+x^2
> E2 = -1+x+x^2
> In E1, I get the right solution, (x ,E1)=(-0.5 , 0.75)
> In E2, I get the *wrong* solution, (x,E2)=(-0.6180 , 0)
> I think the reason why E2 get the wrong answear is that
> *_LevenbergMarquardt_* method use "MINPACK.lmdif".The MINPACK.lmdif
> seems to minize the sum of square.
This is true according to the documentation for minpack subroutine
lmdif. So the procedure will terminate when especially a root is
founded. This is also the reason why you got 0.6180 ( you really mean
0.6180 and not -0.6180) as a result since this is a root from E2.
Below a standalone example is provided:
# include <iostream>
# include <ql/math/optimization/levenbergmarquardt.hpp>
# include <ql/math/optimization/constraint.hpp>
# include <ql/math/optimization/costfunction.hpp>
# include <boost/foreach.hpp>
using namespace QuantLib;
class OneDimensionalPolynomialDegreeN : public CostFunction {
public:
OneDimensionalPolynomialDegreeN(const Array& coefficients)
: coefficients_(coefficients),
polynomialDegree_(coefficients.size()-1) {}
Real value(const Array& x) const {
QL_REQUIRE(x.size()==1,"independent variable must be 1 dimensional");
Real y = 0;
for (Size i=0; i<=polynomialDegree_; ++i) y +=
coefficients_[i]*std::pow(x[0],static_cast<int>(i));
return y;
}
Disposable<Array> values(const Array& x) const{
QL_REQUIRE(x.size()==1,"independent variable must be 1 dimensional");
Array y(1);
y[0] = value(x);
return y;
}
private:
Array const coefficients_;
Size const polynomialDegree_;
};
int main()
{
Array c(3, 1.0); c[0]=-1.0;
OneDimensionalPolynomialDegreeN p(c);
NoConstraint n;
Real ps[] = { -3.0,-2.0,-1.5,-1.0,-0.5,0.0,0.5,1.0,1.5,2.0,3.0 };
std::cout<< "init" << "\t" << "result" << "\t" << "value" << "\t" <<
"ec" << "\n";
BOOST_FOREACH(Real init,ps)
{
Array i(1, init);
LevenbergMarquardt o;
EndCriteria e(1000, 100, 1e-5, 1e-5, 1e-5);
Problem pp(p, n,i);
EndCriteria::Type ec = o.minimize(pp, e);
Array xM = pp.currentValue();
Array yM = pp.values(xM);
std::cout<< init << "\t" << xM[0] << "\t" << yM[0] << "\t" << ec << "\n";
}
return 1;
}
> That means it dose not minize the equation but MSE.
> Therefore,I think *_LevenbergMarquardt_* in QuantLib seems to min the
> value (E1-0)^2 in E1 and min the value (E2-0)^2 in E2.Hence I got the
> wrong solution.
> So, did I use the method wrong ?
> Or QuantLib use the wrong methd "MINPACK.lmdif" ?
> Regards,
> 蔡宗 儒 Jason Tsai
> 永豐銀行 風險管理處
> TEL:81618681
> FAX:81618482
>
>
> ------------------------------------------------------------------------------
> Enable your software for Intel(R) Active Management Technology to meet the
> growing manageability and security demands of your customers. Businesses
> are taking advantage of Intel(R) vPro (TM) technology - will your software
> be a part of the solution? Download the Intel(R) Manageability Checker
> today! http://p.sf.net/sfu/intel-dev2devmar
>
>
> _______________________________________________
> QuantLib-dev mailing list
> Qua...@li...
> https://lists.sourceforge.net/lists/listinfo/quantlib-dev
|