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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
////////////////////////////////////////////////////////////////
};