You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/iAlg/iAlgMath/zxBessel.h

118 lines
3.6 KiB
C

#pragma once
#include "math.h"
#include "zxHugeNum.h"
// 贝塞尔函数
class I_ALGMATH_EXPORT zxBessel
{
public:
zxBessel();
~zxBessel();
public:
// TODO 注意,对于matlab的bessel函数,其实是有 besseli(0, q1, 1) 这种写法的
// 即:存在 第三个参数 1,即修正bessel方式,
// 如果不输入这个参数(或输入 0)时,besseli 直接计算函数值。
// 当自变量 q1 较大时,函数值会急剧增大,很容易超出双精度浮点数的上限(即“上溢”),
// 导致计算结果变为 Inf 而失效
// 如果输入这个参数 1 之后,MATLAB 会计算 缩放后的值,也就是说,它会乘上一个指数衰减因子
// exp(-abs(x)) 来抵消函数本身的高速增长。
// 即:
// besseli(0, q1) → 等价于 besseli(0, q1, 0) → 不乘衰减因子,直接算原函数值。
// besseli(0, q1, 1) → 才乘衰减因子 exp(-abs(q1))
// 贝塞尔函数(基础函数部分)
bool besselI0(double x, double &b);
double getbesselI0(double x);
bool besselI1(double x, double &b);
double getbesselI1(double x);
bool besselK0(double x, double &b);
double getbesselK0(double x);
bool besselK1(double x ,double &b);
double getbesselK1(double x);
// 贝塞尔函数(组合模式)
// K1/I1
bool besselK1I1(double x, double &b);
// K0/I0
bool besselK0I0(double x, double &b);
// I0/I1
bool besselI0I1(double x, double &b);
// I0(x)/I1(y)
bool besselI0I1(double x, double y, double &b);
// I0(x)/I0(y)
bool besselI0I0(double x, double y, double &b);
// I1(x)/I1(y)
bool besselI1I1(double x, double y, double &b);
// K1(x)/I1(y)
bool besselK1I1(double x, double y, double &b);
// K1(x)/I0(y)
bool besselK1I0(double x, double y, double &b);
// K0(x)/I0(y)
bool besselK0I0(double x, double y, double &b);
// (I0(x)/I1(x))/(I0(y)/I1(y)),暂未启用
bool besselI0I1I0I1(double x, double y, double &b);
// (K0(x)/I0(x))/(K1(y)/I1(y)),暂未启用
bool besselK0I0K1I1(double x, double y, double &b);
// 大数模式
zxHugeNum besselI(int which, double x);
zxHugeNum besselK(int which, double x);
public:
////////////////////////////////////////////////////////////////
// 由于单个的超过数值范围,故一起在内部进行处理
// 仅仅测试
//double calDemoA(double d1, double d2);
//double calDemoB(double d1, double d2);
zxHugeNum besselDivide(bool byK1, int which1, double x1, \
bool byK2, int which2, double x2, \
bool* pOk = nullptr);
zxHugeNum besselMultiple(bool byK1, int which1, double x1, \
bool byK2, int which2, double x2, \
bool* pOk = nullptr);
protected:
zxHugeNum besselDivMul(bool bDivide, \
bool byK1, int which1, double x1, \
bool byK2, int which2, double x2, \
bool* pOk = nullptr);
double _besselByY(double y, bool bK, int which, bool bLower);
public:
void setComMode(bool b) { m_bComMode = b; }
bool isComMode() { return m_bComMode; }
double getResultI() { return m_dIndex; }
double getResultM() { return m_dMultipler; }
private:
bool m_bComMode; //对于大数,采取复合模式
double m_dIndex; //exp的次数
double m_dMultipler; //乘数,合起来是 exp(m_dIndex) * m_dMultipler;
////////////////////////////////////////////////////////////////
};