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

128 lines
3.7 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:
// 202604 由殷维基于PF需要进行贝塞尔函数扩充不限于0和1而是改为传递double分数
// 在此基础上解航提出解析模型采用该方法可以规避震荡问题但是目前只用到novel_besselk
// 第一类修正贝塞尔函数 I_nu(z)
// 注该函数目前只被yinw算法应用
// 1.算法由yinw提供后来因为震荡经xieh针对溢出进行修改
// 2.但后来随着yinw算法调整调用该函数发现xieh修改不妥
// 只好再次倒回去
// 幸亏xieh本身没有用到该函数
// 后续还是需要进一步完善优化该函数的
static double novel_besseli(double nu, double z);
// 第二类修正贝塞尔函数 K_nu(z)
// 注该函数目前被yinw算法+xieh算法中均有应用
static double novel_besselk(double nu, double z);
// 纯手工实现伽马函数 Gamma(z)
static double bessel_gamma(double z);
public:
// 贝塞尔函数(基础函数部分)
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;
////////////////////////////////////////////////////////////////
};