www.pudn.com > 1.rar > FktParser.h
#ifndef __FUNCTIONPARSER_H #define __FUNCTIONPARSER_H //#include "stdafx.h" // Klassen in diesem Header-File (Forward-Deklarationen) /* templateclass CFunction; template class CNullFunction; template class CIdentityFunction; template class CPolynom1Function; template class CPolynom2Function; template class CPolynom3Function; template class CPolynom4Function; template class CExp1Function; template class CSin1Function; template class CCos1Function; template class CTan1Function; template class CCot1Function; template class CAsin1Function; template class CAcos1Function; template class CAtan1Function; template class CSinh1Function; template class CCosh1Function; template class CTanh1Function; template class CCoth1Function; template class CSign1Function; template class CAbs1Function; template class CCeil1Function; template class CFloor1Function; template class CLog101Function; template class CLog1Function; template class CLogarithmus1Function; template class CSqrt1Function; template class CSqr1Function; template class CGamma1Function; template class CConstFunction; template class CFunction1; template class CExpFunction; template class CSinFunction; template class CCosFunction; template class CTanFunction; template class CCotFunction; template class CAsinFunction; template class CAcosFunction; template class CAtanFunction; template class CSinhFunction; template class CCoshFunction; template class CTanhFunction; template class CCothFunction; template class CSignFunction; template class CAbsFunction; template class CCeilFunction; template class CFloorFunction; template class CLog10Function; template class CLogFunction; template class CLogarithmusFunction; template class CSqrFunction; template class CSqrtFunction; template class CGammaFunction; template class CNegFunction; template class CAdd0Function; template class CSubR0Function; template class CSubL0Function; template class CMul0Function; template class CDivL0Function; template class CDivR0Function; template class CPowerL0Function; template class CPowerR0Function; template class CFunction2; template class CAddFunction; template class CSubFunction; template class CMulFunction; template class CDivFunction; template class CPowerFunction; template class CComponenteFunction; */ // Um symbolisches Ableiten zu beschleunigen: // Kann besser gemacht werden, indem erst die Bausteine der Ableitung berechnet werden und dann nochmal geguckt wird #define DERIVATE_TEST if (IsConstantFunction()) return new CNullFunction (); // Basisklasse, abstrakt template class CFunction : public CObject { public: // Konstruktor, Destruktor CFunction() {}; virtual ~CFunction() {}; // Abstrakte Prototypen virtual CString GetName() const = 0; // abstrakte Funktion, muß überschrieben werden virtual CString GetTeX() const = 0; // abstrakte Funktion, muß überschrieben werden virtual CFunction * GetDerivate() const = 0; // abstrakte Funktion, muß überschrieben werden virtual CFunction * GetDuplicate(bool simplify = true) const = 0; // abstrakte Funktion, muß überschrieben werden virtual T Execute(T x) const = 0; // abstrakte Funktion, muß überschrieben werden virtual bool IsConstantFunction() const {return false;} // Sollte überschrieben werden, um symbolische Operationen zu beschleunigen und Ausdrücke zu vereinfachen virtual bool IsNullFunction() const {return false;} // Sollte überschrieben werden, um symbolische Operationen zu beschleunigen und Ausdrücke zu vereinfachen // Ableitung, Nullstellenbestimmung, Integrale (numerisch) virtual T Derivate(T x, int grad = 1, double h = 1E-6) const; virtual T Nullstelle_Newton(T StartWert, double tol = 1E-6) const; virtual T Integral_Trapezregel(T x1, T x2, long nIntervals, double tol = 1E-6) const; virtual T Integral_Mittelpunktregel(T x1, T x2, long nIntervals, double tol = 1E-6) const; virtual T Integral_Simpsonregel(T x1, T x2, long nIntervals, double tol = 1E-6) const; // Funktions-Parser und Hilfsfunktionen static CFunction * Parse(CString& str, const char* Var = _T("X")); static CFunction * Parse1(const char* str, const char* Var = _T("X")); static bool IsFunction(CString& str, const char* Token); // Prüft, ob Ausdruck Funktion ist static bool IsConstFunction(CString& str, const char* Token); // Prüft, ob Ausdruck Funktion ist und ob das Argument die Identität ist static bool IsPureFunction(CString& str, const char* Token, const char* Var = _T("X")); // Prüft, ob Ausdruck Funktion ist und ob das Argument die Identität ist static bool IsConst(const char* str); // strtod anwendbar? static T Value(const char* str); // liefert Ergebnis der Funktion strtod static bool IsIdentity(const char* str, const char* Var = _T("X")); }; // Funktion mit einer eingebetteten Funktion, immer noch abstrakt! template class CFunction1 : public CFunction { public: CFunction1(CFunction * _f1) : f1(_f1) {}; virtual ~CFunction1() {delete f1;}; virtual CString GetConcName(const char* basisfkt) const; protected: CFunction * f1; }; // Funktion mit zwei eingebetteten Funktionen, immer noch abstrakt! template class CFunction2 : public CFunction { public: CFunction2(CFunction * _f1, CFunction * _f2) : f1(_f1), f2(_f2) {}; virtual ~CFunction2() {delete f1; delete f2;}; virtual CString GetConcName(const char* basisfkt) const; protected: CFunction * f1; CFunction * f2; }; // Nullfunktion template class CNullFunction : public CFunction { public: CNullFunction() {}; virtual T Execute(T /*x*/) const {return 0;}; virtual bool IsConstantFunction() const {return true;} virtual bool IsNullFunction() const {return true;} virtual CString GetName() const {return _T("0");}; virtual CString GetTeX() const {return _T("0");}; virtual CFunction * GetDerivate() const {return new CNullFunction ;}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; // Identität template class CIdentityFunction : public CFunction { public: CIdentityFunction() {}; virtual T Execute(T x) const {return x;}; virtual CString GetName() const {return _T("x");}; virtual CString GetTeX() const {return _T("x");}; virtual CFunction * GetDerivate() const {return new CConstFunction (1);}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CIdentityFunction ;}; }; // Polynome template class CPolynom1Function : public CFunction { public: CPolynom1Function(T _a0, T _a1) : a0(_a0), a1(_a1) {}; virtual T Execute(T x) const {return a0+x*a1;}; virtual bool IsConstantFunction() const {return a1==0.0;} virtual bool IsNullFunction() const {return a1==0.0 && a0==0.0;} virtual CString GetName() const; virtual CString GetTeX() const; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CConstFunction (a1);}; virtual CFunction * GetDuplicate(bool simplify = true) const; private: T a0; T a1; }; template class CPolynom2Function : public CFunction { public: CPolynom2Function(T _a0, T _a1, T _a2) : a0(_a0), a1(_a1), a2(_a2) {}; virtual T Execute(T x) const {return a0+x*(a1+x*a2);}; virtual bool IsConstantFunction() const {return a2==0.0 && a1==0.0;} virtual bool IsNullFunction() const {return a2==0.0 && a1==0.0 && a0==0.0;} virtual CString GetName() const; virtual CString GetTeX() const; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CPolynom1Function (a1,2*a2);}; virtual CFunction * GetDuplicate(bool simplify = true) const; private: T a0; T a1; T a2; }; template class CPolynom3Function : public CFunction { public: CPolynom3Function(T _a0, T _a1, T _a2, T _a3) : a0(_a0), a1(_a1), a2(_a2), a3(_a3) {}; virtual T Execute(T x) const {return a0+x*(a1+x*(a2+x*a3));}; virtual bool IsConstantFunction() const {return a3==0.0 && a2==0.0 && a1==0.0;} virtual bool IsNullFunction() const {return a3==0.0 && a2==0.0 && a1==0.0 && a0==0.0;} virtual CString GetName() const; virtual CString GetTeX() const; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CPolynom2Function (a1,2*a2,3*a3);}; virtual CFunction * GetDuplicate(bool simplify = true) const; private: T a0; T a1; T a2; T a3; }; template class CPolynom4Function : public CFunction { public: CPolynom4Function(T _a0, T _a1, T _a2, T _a3, T _a4) : a0(_a0), a1(_a1), a2(_a2), a3(_a3), a4(_a4) {}; virtual T Execute(T x) const {return a0+x*(a1+x*(a2+x*(a3+x*a4)));}; virtual bool IsConstantFunction() const {return a4==0.0 && a3==0.0 && a2==0.0 && a1==0.0;} virtual bool IsNullFunction() const {return a4==0.0 && a3==0.0 && a2==0.0 && a1==0.0 && a0==0.0;} virtual CString GetName() const; virtual CString GetTeX() const; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CPolynom3Function (a1,2*a2,3*a3,4*a4);}; virtual CFunction * GetDuplicate(bool simplify = true) const; private: T a0; T a1; T a2; T a3; T a4; }; // Exponentialfunktion template class CExpFunction : public CFunction1 { public: CExpFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return expl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsNullFunction();} virtual CString GetName() const {return GetConcName(_T("exp"));}; virtual CString GetTeX() const {CString str = _T("e^{"); str += f1->GetTeX(); str += _T("}"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CExpFunction (f1->GetDuplicate()), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CExp1Function : public CFunction { public: CExp1Function() {}; virtual T Execute(T x) const {return expl(x);}; virtual CString GetName() const {return _T("exp(x)");}; virtual CString GetTeX() const {return _T("e^x");}; virtual CFunction * GetDerivate() const {return new CExp1Function ;}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CExp1Function ;}; }; // Trigonometrische Funktionen template class CSinFunction : public CFunction1 { public: CSinFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return sinl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual bool IsNullFunction() const {return f1->IsNullFunction();} virtual CString GetName() const {return GetConcName(_T("sin"));}; virtual CString GetTeX() const {CString str = _T("\\sin\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CCosFunction (f1->GetDuplicate()), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CCosFunction : public CFunction1 { public: CCosFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return cosl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual CString GetName() const {return GetConcName(_T("cos"));}; virtual CString GetTeX() const {CString str = _T("\\cos\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CNegFunction (new CMulFunction (new CSinFunction (f1->GetDuplicate()), f1->GetDerivate()));}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CTanFunction : public CFunction1 { public: CTanFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return tanl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual bool IsNullFunction() const {return f1->IsNullFunction();} virtual CString GetName() const {return GetConcName(_T("tan"));}; virtual CString GetTeX() const {CString str = _T("\\tan\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CAdd0Function (new CMulFunction (new CTanFunction (f1->GetDuplicate()), new CTanFunction (f1->GetDuplicate())), 1), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CCotFunction : public CFunction1 { public: CCotFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return cosl(f1->Execute(x))/sinl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual CString GetName() const {return GetConcName(_T("cot"));}; virtual CString GetTeX() const {CString str = _T("\\cot\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CNegFunction (new CMulFunction (new CAdd0Function (new CMulFunction (new CCotFunction (f1->GetDuplicate()), new CCotFunction (f1->GetDuplicate())), 1), f1->GetDerivate()));}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CAsinFunction : public CFunction1 { public: CAsinFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return asinl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual bool IsNullFunction() const {return f1->IsNullFunction();} virtual CString GetName() const {return GetConcName(_T("Asin"));}; virtual CString GetTeX() const {CString str = _T("\\arcsin\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CDivL0Function (1, new CSqrtFunction (new CPolynom2Function (1, 0, -1))), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CAcosFunction : public CFunction1 { public: CAcosFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return acosl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual CString GetName() const {return GetConcName(_T("Acos"));}; virtual CString GetTeX() const {CString str = _T("\\arccos\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CDivL0Function (-1, new CSqrtFunction (new CPolynom2Function (1, 0, -1))), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CAtanFunction : public CFunction1 { public: CAtanFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return atanl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual bool IsNullFunction() const {return f1->IsNullFunction();} virtual CString GetName() const {return GetConcName(_T("Atan"));}; virtual CString GetTeX() const {CString str = _T("\\arctan\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CDivL0Function (1, new CPolynom2Function (1, 0, 1)), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CAcotFunction : public CFunction1 { public: CAcotFunction(CFunction * _f1) : CFunction1 (_f1) {}; virtual T Execute(T x) const {return acotl(f1->Execute(x));}; virtual bool IsConstantFunction() const {return f1->IsConstantFunction();} virtual CString GetName() const {return GetConcName(_T("Acot"));}; virtual CString GetTeX() const {CString str = _T("\\mathop{\\rm arccot}\\left("); str += f1->GetTeX(); str += _T("\\right)"); return str;}; virtual CFunction * GetDerivate() const {DERIVATE_TEST; return new CMulFunction (new CDivL0Function (-1, new CPolynom2Function (1, 0, 1))), f1->GetDerivate());}; virtual CFunction * GetDuplicate(bool simplify = true) const; }; template class CSin1Function : public CFunction { public: CSin1Function() {}; virtual T Execute(T x) const {return sinl(x);}; virtual CString GetName() const {return _T("sin(x)");}; virtual CString GetTeX() const {return _T("\\sin(x)");}; virtual CFunction * GetDerivate() const {return new CCos1Function ;}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CSin1Function ;}; }; template class CCos1Function : public CFunction { public: CCos1Function() {}; virtual T Execute(T x) const {return cosl(x);}; virtual CString GetName() const {return _T("cos(x)");}; virtual CString GetTeX() const {return _T("\\cos(x)");}; virtual CFunction * GetDerivate() const {return new CNegFunction (new CSin1Function );}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CCos1Function ;}; }; template class CTan1Function : public CFunction { public: CTan1Function() {}; virtual T Execute(T x) const {return tanl(x);}; virtual CString GetName() const {return _T("tan(x)");}; virtual CString GetTeX() const {return _T("\\tan(x)");}; virtual CFunction * GetDerivate() const {return new CAdd0Function (new CMulFunction (new CTan1Function , new CTan1Function ), 1);}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CTan1Function ;}; }; template class CCot1Function : public CFunction { public: CCot1Function() {}; virtual T Execute(T x) const {return cosl(x)/sinl(x);}; virtual CString GetName() const {return _T("cot(x)");}; virtual CString GetTeX() const {return _T("\\cot(x)");}; virtual CFunction * GetDerivate() const {return new CNegFunction (new CAdd0Function (new CMulFunction (new CCot1Function , new CCot1Function ), 1));}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CCot1Function ;}; }; template class CAsin1Function : public CFunction { public: CAsin1Function() {}; virtual T Execute(T x) const {return asinl(x);}; virtual CString GetName() const {return _T("Asin(x)");}; virtual CString GetTeX() const {return _T("\\arcsin(x)");}; virtual CFunction * GetDerivate() const {return new CDivL0Function (1, new CSqrtFunction (new CPolynom2Function (1,0,-1)));}; virtual CFunction * GetDuplicate(bool /*simplify*/ = true) const {return new CAsin1Function ;}; }; template class CAcos1Function : public CFunction { public: CAcos1Function() {}; virtual T Execute(T x) const {return acosl(x);}; virtual CString GetName() const {return _T("Acos(x)");}; virtual CString GetTeX() const {return _T("\\arccos(x)");}; virtual CFunction * GetDerivate() const {return new CDivL0Function (-1, new CSqrtFunction (new CPolynom2Function (1,0,-1)));}; virtual CFunction