std::cyl_neumann, std::cyl_neumannf, std::cyl_neumannl
来自cppreference.com
| 在标头 <cmath> 定义
|
||
| (1) | (C++17 起) (C++23 前) |
|
| (C++23 起) | ||
| |
(2) | (C++17 起) |
| |
(3) | (C++17 起) |
| 在标头 <cmath> 定义
|
||
| |
(A) | (C++17 起) |
1-3) 计算
nu 和 x 的柱诺依曼函数(也称为第二类贝塞尔函数或 Weber 函数)。标准库提供所有以无 cv 限定的浮点数类型作为形参 nu 和 x 的类型的 std::cyl_neumann 重载。(C++23 起)A) 为算术类型的所有其他组合提供额外重载。
参数
| nu | - | 函数的阶数 |
| x | - | 函数的实参 |
返回值
如果没有发生错误,那么返回 nu 和 x 的柱诺依曼函数(第二类贝塞尔函数)的值,即对于 x≥0 和非整数 nu 的
| Jnu(x)cos(nuπ)-J-nu(x) |
| sin(nuπ) |
(其中 Jnu(x) 是 std::cyl_bessel_j(nu, x));对整数 nu 使用极限。
错误处理
可能报告 math_errhandling 中指定的错误
- 如果实参是 NaN,那么返回 NaN 且不报告定义域错误
- 如果 nu>=128,那么行为由实现定义
注解
不支持 C++17,但支持 ISO 29124:2010 的实现在定义了 __STDCPP_MATH_SPEC_FUNCS__ 为至少 201003L 的值,且用户在包含任何标准库头文件前定义了 __STDCPP_WANT_MATH_SPEC_FUNCS__ 时也会提供此函数。
不支持 ISO 29124:2010 但支持 TR 19768:2007 (TR1) 的实现也会在标头 tr1/cmath 及命名空间 std::tr1 中提供此函数。
此函数的一种实现参考 boost.math。
额外重载不需要严格以 (A) 的形式提供。它们只需要能够对它们的第一个实参 num1 和第二个实参 num2 满足以下要求即可:
|
(C++23 前) |
|
如果 如果不存在等级和子等级最高的浮点数类型,那么在重载决议时不会从提供的重载中产生可用的候选。 |
(C++23 起) |
示例
运行此代码
#include <cassert>
#include <cmath>
#include <iostream>
#include <numbers>
const double π = std::numbers::pi; // C++20 前使用 std::acos(-1)
// 要通过第一类柱贝塞尔函数来计算柱诺依曼函数,我们需要自己实现 J,
// 因为按照上文的公式直接调用 std::cyl_bessel_j(nu, x) 的话
// 在 nu 为负的情况下会引发 std::domain_error:__cyl_bessel_j 参数错误。
double J_neg(double nu, double x)
{
return std::cos(-nu * π) * std::cyl_bessel_j(-nu, x)
-std::sin(-nu * π) * std::cyl_neumann(-nu, x);
}
double J_pos(double nu, double x)
{
return std::cyl_bessel_j(nu, x);
}
double J(double nu, double x)
{
return nu < 0.0 ? J_neg(nu, x) : J_pos(nu, x);
}
int main()
{
std::cout << "对 nu == 0.5 点检查\n" << std::fixed << std::showpos;
const double nu = 0.5;
for (double x = 0.0; x <= 2.0; x += 0.333)
{
const double n = std::cyl_neumann(nu, x);
const double j = (J(nu, x) * std::cos(nu * π) - J(-nu, x)) / std::sin(nu * π);
std::cout << "N_.5(" << x << ") = " << n << ",通过 J 计算 = " << j << '\n';
assert(n == j);
}
}
输出:
对 nu == 0.5 点检查
N_.5(+0.000000) = -inf,通过 J 计算 = -inf
N_.5(+0.333000) = -1.306713,通过 J 计算 = -1.306713
N_.5(+0.666000) = -0.768760,通过 J 计算 = -0.768760
N_.5(+0.999000) = -0.431986,通过 J 计算 = -0.431986
N_.5(+1.332000) = -0.163524,通过 J 计算 = -0.163524
N_.5(+1.665000) = +0.058165,通过 J 计算 = +0.058165
N_.5(+1.998000) = +0.233876,通过 J 计算 = +0.233876
参阅
(C++17)(C++17)(C++17) |
规则变形圆柱贝塞尔函数 (函数) |
(C++17)(C++17)(C++17) |
(第一类)圆柱贝塞尔函数 (函数) |
(C++17)(C++17)(C++17) |
不规则变形圆柱贝塞尔函数 (函数) |
外部链接
| Weisstein, Eric W. “第二类贝塞尔函数”来自 MathWorld--A Wolfram Web Resource。 |