LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{integration_special_functions.cpp} 命名空间参考

函数

bool sf_is_fn_of_var (const std::shared_ptr< const SymbolicNode > &node, FunctionNode::FuncType t, const std::string &var)
bool sf_is_inv_ln_var (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
bool sf_is_inv_var (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
Result< bool > sf_match_exp_neg_quad (const std::shared_ptr< const SymbolicNode > &node, const std::string &var, Rational &c_out, ComputationContext &context)
bool sf_split_inv_var (const std::shared_ptr< const SymbolicNode > &node, const std::string &var, std::vector< std::shared_ptr< const SymbolicNode > > &other_factors, bool &has_inv_var)
std::shared_ptr< SymbolicExpr > sf_sqrt_pi ()

函数说明

◆ sf_is_fn_of_var()

bool LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_fn_of_var ( const std::shared_ptr< const SymbolicNode > & node,
FunctionNode::FuncType t,
const std::string & var )

在文件 integration_special_functions.cpp 第 17 行定义.

19 {
20 auto fn = std::dynamic_pointer_cast<const FunctionNode>(node);
21 if (!fn || fn->type() != t) { return false; }
22 if (fn->arguments().size() != 1) { return false; }
23 auto v = std::dynamic_pointer_cast<const VariableNode>(fn->arguments()[0]);
24 return v && !v->is_constant() && v->name() == var;
25}
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t

引用了 sf_is_fn_of_var(), LMCAS::t , 以及 LMCAS::v.

被这些函数引用 sf_is_fn_of_var() , 以及 sf_is_inv_ln_var().

函数调用图:
这是这个函数的调用关系图:

◆ sf_is_inv_ln_var()

bool LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_inv_ln_var ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var )

在文件 integration_special_functions.cpp 第 40 行定义.

41 {
42 auto pw = std::dynamic_pointer_cast<const PowerNode>(node);
43 if (!pw) { return false; }
44 if (!sf_is_fn_of_var(pw->base(), FunctionNode::FuncType::Ln, var)) { return false; }
45 const auto exponent = detail::exact_rational_value(pw->exponent());
46 return exponent && *exponent == Rational(-1);
47}
bool sf_is_fn_of_var(const std::shared_ptr< const SymbolicNode > &node, FunctionNode::FuncType t, const std::string &var)
std::optional< Rational > exact_rational_value(const NumberNode &number)
const ExprPtr & exponent

引用了 LMCAS::detail::exact_rational_value(), LMCAS::exponent, LMCAS::FunctionNode::Ln, sf_is_fn_of_var() , 以及 sf_is_inv_ln_var().

被这些函数引用 sf_is_inv_ln_var().

函数调用图:
这是这个函数的调用关系图:

◆ sf_is_inv_var()

bool LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_is_inv_var ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var )

在文件 integration_special_functions.cpp 第 29 行定义.

30 {
31 auto pw = std::dynamic_pointer_cast<const PowerNode>(node);
32 if (!pw) { return false; }
33 auto b = std::dynamic_pointer_cast<const VariableNode>(pw->base());
34 if (!b || b->is_constant() || b->name() != var) { return false; }
35 const auto exponent = detail::exact_rational_value(pw->exponent());
36 return exponent && *exponent == Rational(-1);
37}
const MultiPoly & b

引用了 LMCAS::b, LMCAS::detail::exact_rational_value(), LMCAS::exponent , 以及 sf_is_inv_var().

被这些函数引用 sf_is_inv_var() , 以及 sf_split_inv_var().

函数调用图:
这是这个函数的调用关系图:

◆ sf_match_exp_neg_quad()

Result< bool > LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_match_exp_neg_quad ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var,
Rational & c_out,
ComputationContext & context )

在文件 integration_special_functions.cpp 第 81 行定义.

83 {
84 auto fn = std::dynamic_pointer_cast<const FunctionNode>(node);
85 if (!fn || fn->type() != FunctionNode::FuncType::Exp) { return false; }
86 if (fn->arguments().size() != 1) { return false; }
87 auto arg = LMCAS::detail::expression_from_node(fn->arguments()[0]);
88 auto converted = recognize_rational_polynomial(arg, var, context);
89 if (!converted) { return Result<bool>::failure(converted.error()); }
90 if (!converted.value()) { return false; }
91 const auto& poly = *converted.value();
92 if (poly.degree() != 2) { return false; }
93 if (poly.coeffs.size() < 3) { return false; }
94 // Constant and linear terms must be zero.
95 if (!(poly.coeffs[0] == Rational(0))) { return false; }
96 if (!(poly.coeffs[1] == Rational(0))) { return false; }
97 Rational a2 = poly.coeffs[2];
98 // Need a strictly negative coefficient: exp(-c*x^2) with c > 0.
99 if (!(a2 < Rational(0))) { return false; }
100 c_out = Rational(0) - a2; // c = -a2 > 0
101 return true;
102}
static Result failure(CasErrc code, std::string message, std::string operation={})
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Rational
Rational numbers
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)

引用了 LMCAS::context, LMCAS::FunctionNode::Exp, LMCAS::detail::expression_from_node(), LMCAS::Result< T >::failure(), LMCAS::recognize_rational_polynomial() , 以及 sf_match_exp_neg_quad().

被这些函数引用 sf_match_exp_neg_quad().

函数调用图:
这是这个函数的调用关系图:

◆ sf_split_inv_var()

bool LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_split_inv_var ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var,
std::vector< std::shared_ptr< const SymbolicNode > > & other_factors,
bool & has_inv_var )

多个 1/x 因子形成 1/x^2 类幂次,超出此路径的处理范围。

在文件 integration_special_functions.cpp 第 52 行定义.

55 {
56 other_factors.clear();
57 has_inv_var = false;
58 std::vector<std::shared_ptr<const SymbolicNode>> factors;
59 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
60 factors = mul->operands();
61 } else {
62 factors.push_back(node);
63 }
64 for (const auto& f : factors) {
65 if (sf_is_inv_var(f, var)) {
66 if (has_inv_var) { return false; } /** @brief 多个 1/x 因子形成 1/x^2 类幂次,超出此路径的处理范围。 */
67 has_inv_var = true;
68 } else {
69 other_factors.push_back(f);
70 }
71 }
72 return true;
73}
bool sf_is_inv_var(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)

引用了 LMCAS::mul(), sf_is_inv_var() , 以及 sf_split_inv_var().

被这些函数引用 sf_split_inv_var().

函数调用图:
这是这个函数的调用关系图:

◆ sf_sqrt_pi()

std::shared_ptr< SymbolicExpr > LMCAS::anonymous_namespace{integration_special_functions.cpp}::sf_sqrt_pi ( )
inline

在文件 integration_special_functions.cpp 第 10 行定义.

10 {
11 return SymbolicExpr::sqrt(LMCAS::detail::make_expression_ptr(
13}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node() , 以及 sf_sqrt_pi().

被这些函数引用 sf_sqrt_pi().

函数调用图:
这是这个函数的调用关系图: