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

类型定义

typedef std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > RatPair
 递归求值已执行 sin/cos->t 代换的表达式,生成关于 t 的多项式分子与分母; nullopt 表示当前节点位于有理函数支持域之外.

函数

bool weier_has_trig_of_var (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
 是否至少包含一个 sin(var)/cos(var)/tan(var)... 形式(确保确实是三角有理函数)
bool weier_is_rational_trig (const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
 判断表达式是否仅由 var 通过 sin(var)/cos(var)/tan(var) 以及常数,四则,整数幂构成, 即关于 sin/cos 的有理函数.含有其它依赖 var 的函数(exp/ln/sqrt 等)时返回 false.
bool weier_rational_function (const FunctionNode &fn, const std::string &var)
std::optional< RatPair > weier_rational_power (const PowerNode &pw, const std::string &tvar, const std::shared_ptr< SymbolicExpr > &one, ComputationContext &context)
Result< std::shared_ptr< SymbolicExpr > > weier_reduce_rational (const std::shared_ptr< SymbolicExpr > &num_poly, const std::shared_ptr< SymbolicExpr > &den_poly, const std::string &tvar, ComputationContext &context)
std::shared_ptr< const SymbolicNode > weier_replace (const std::shared_ptr< const SymbolicNode > &node, const std::string &var, const std::string &tvar)
std::shared_ptr< const SymbolicNode > weier_replace_function (const FunctionNode &fn, const std::string &var, const std::string &tvar)
std::optional< RatPair > weier_to_rational (const std::shared_ptr< const SymbolicNode > &node, const std::string &tvar, ComputationContext &context)
bool weier_trig_function (const FunctionNode &fn)
bool weier_trig_of_variable (const FunctionNode &function, const std::string &var)

类型定义说明

◆ RatPair

typedef std::pair<std::shared_ptr<SymbolicExpr>, std::shared_ptr<SymbolicExpr> > LMCAS::anonymous_namespace{integration_weierstrass.cpp}::RatPair

递归求值已执行 sin/cos->t 代换的表达式,生成关于 t 的多项式分子与分母; nullopt 表示当前节点位于有理函数支持域之外.

在文件 integration_weierstrass.cpp 第 162 行定义.

函数说明

◆ weier_has_trig_of_var()

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

是否至少包含一个 sin(var)/cos(var)/tan(var)... 形式(确保确实是三角有理函数)

在文件 integration_weierstrass.cpp 第 69 行定义.

69 {
70 if (!node) { return false; }
71 if (auto fn = std::dynamic_pointer_cast<const FunctionNode>(node)) {
72 if (weier_trig_of_variable(*fn, var)) {
73 return true;
74 }
75 for (auto& a : fn->arguments()) if (weier_has_trig_of_var(a, var)) { return true; }
76 return false;
77 }
78 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
79 for (auto& op : add->operands()) if (weier_has_trig_of_var(op, var)) { return true; }
80 return false;
81 }
82 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
83 for (auto& op : mul->operands()) if (weier_has_trig_of_var(op, var)) { return true; }
84 return false;
85 }
86 if (auto pw = std::dynamic_pointer_cast<const PowerNode>(node)) {
87 return weier_has_trig_of_var(pw->base(), var) || weier_has_trig_of_var(pw->exponent(), var);
88 }
89 return false;
90}
bool weier_trig_of_variable(const FunctionNode &function, const std::string &var)
bool weier_has_trig_of_var(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
是否至少包含一个 sin(var)/cos(var)/tan(var)... 形式(确保确实是三角有理函数)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const ExprPtr RelationOp op
__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 const std::shared_ptr< SymbolicExpr > & a

引用了 LMCAS::a, LMCAS::add(), LMCAS::mul(), LMCAS::op, weier_has_trig_of_var() , 以及 weier_trig_of_variable().

被这些函数引用 weier_has_trig_of_var().

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

◆ weier_is_rational_trig()

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

判断表达式是否仅由 var 通过 sin(var)/cos(var)/tan(var) 以及常数,四则,整数幂构成, 即关于 sin/cos 的有理函数.含有其它依赖 var 的函数(exp/ln/sqrt 等)时返回 false.

裸 var 表示输入超出 sin/cos 有理函数域.

指数必须是不依赖 var 的整数常数

在文件 integration_weierstrass.cpp 第 33 行定义.

33 {
34 if (!node) { return true; }
35 if (auto vn = std::dynamic_pointer_cast<const VariableNode>(node)) {
36 /// 裸 var 表示输入超出 sin/cos 有理函数域.
37 return vn->is_constant() || vn->name() != var;
38 }
39 if (std::dynamic_pointer_cast<const NumberNode>(node)) { return true; }
40 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
41 for (auto& op : add->operands()) if (!weier_is_rational_trig(op, var)) { return false; }
42 return true;
43 }
44 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
45 for (auto& op : mul->operands()) if (!weier_is_rational_trig(op, var)) { return false; }
46 return true;
47 }
48 if (auto pw = std::dynamic_pointer_cast<const PowerNode>(node)) {
49 /// 指数必须是不依赖 var 的整数常数
50 auto en = std::dynamic_pointer_cast<const NumberNode>(pw->exponent());
51 if (!en) { return false; }
52 return weier_is_rational_trig(pw->base(), var);
53 }
54 if (auto fn = std::dynamic_pointer_cast<const FunctionNode>(node)) {
55 return weier_rational_function(*fn, var);
56 }
57 return false;
58}
bool weier_is_rational_trig(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
判断表达式是否仅由 var 通过 sin(var)/cos(var)/tan(var) 以及常数,四则,整数幂构成, 即关于 sin/cos 的有理函数.含有其它依赖 var 的函数(exp/ln/sq...
bool weier_rational_function(const FunctionNode &fn, const std::string &var)

引用了 LMCAS::add(), LMCAS::mul(), LMCAS::op, weier_is_rational_trig() , 以及 weier_rational_function().

被这些函数引用 weier_is_rational_trig().

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

◆ weier_rational_function()

bool LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_function ( const FunctionNode & fn,
const std::string & var )

在文件 integration_weierstrass.cpp 第 19 行定义.

19 {
20 if (weier_trig_function(fn)) {
21 auto variable = std::dynamic_pointer_cast<const VariableNode>(fn.arguments()[0]);
22 if (variable && !variable->is_constant() && variable->name() == var) { return true; }
23 return !expression_depends_on_variable(fn.arguments()[0], var);
24 }
25 for (const auto& argument : fn.arguments()) {
26 if (expression_depends_on_variable(argument, var)) { return false; }
27 }
28 return true;
29}
const std::vector< std::shared_ptr< const SymbolicNode > > & arguments() const noexcept
const std::string & variable
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)

引用了 LMCAS::FunctionNode::arguments(), LMCAS::expression_depends_on_variable(), LMCAS::variable, weier_rational_function() , 以及 weier_trig_function().

被这些函数引用 weier_is_rational_trig() , 以及 weier_rational_function().

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

◆ weier_rational_power()

std::optional< RatPair > LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_rational_power ( const PowerNode & pw,
const std::string & tvar,
const std::shared_ptr< SymbolicExpr > & one,
ComputationContext & context )

在文件 integration_weierstrass.cpp 第 166 行定义.

167 {
168
169 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
170 (context).limits().max_ast_nodes, "transform");
171 auto en = std::dynamic_pointer_cast<const NumberNode>(pw.exponent());
172 if (!en) { return std::nullopt; }
173 const auto bounded_exponent = integration_bounded_exponent(*en, -32, 32);
174 if (!bounded_exponent) { return std::nullopt; }
175
176 auto base = weier_to_rational(pw.base(), tvar, context);
177 if (!base) { return std::nullopt; }
178 auto [bn, bd] = *base;
179 const bool neg = *bounded_exponent < 0;
180 const int power_count = neg ? -*bounded_exponent : *bounded_exponent;
181 std::shared_ptr<SymbolicExpr> num = one, den = one;
182 for (int i = 0; i < power_count; ++i) {
183 num = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(num, bn)), transform_budget));
184 den = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(den, bd)), transform_budget));
185 }
186 if (neg) std::swap(num, den);
187 return RatPair{num, den};
188}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > RatPair
递归求值已执行 sin/cos->t 代换的表达式,生成关于 t 的多项式分子与分母; nullopt 表示当前节点位于有理函数支持域之外.
std::optional< RatPair > weier_to_rational(const std::shared_ptr< const SymbolicNode > &node, const std::string &tvar, ComputationContext &context)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr< SymbolicExpr > num(int value)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult neg(const ExprPtr &expression, ComputationContext &context)
std::optional< int > integration_bounded_exponent(const NumberNode &number, int minimum_exponent, int maximum_exponent)

引用了 LMCAS::PowerNode::base(), LMCAS::context, LMCAS::PowerNode::exponent(), LMCAS::integration_bounded_exponent(), LMCAS::detail::make_expression_ptr(), LMCAS::neg(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::polynomial_solver_detail::num(), weier_rational_power() , 以及 weier_to_rational().

被这些函数引用 weier_rational_power() , 以及 weier_to_rational().

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

◆ weier_reduce_rational()

Result< std::shared_ptr< SymbolicExpr > > LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_reduce_rational ( const std::shared_ptr< SymbolicExpr > & num_poly,
const std::shared_ptr< SymbolicExpr > & den_poly,
const std::string & tvar,
ComputationContext & context )

在文件 integration_weierstrass.cpp 第 236 行定义.

238 {
239
240 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
241 (context).limits().max_ast_nodes, "transform");
242 auto numerator = symbolic_to_poly<Rational>(detail::make_expression_ptr(detail::expand_node(detail::node(num_poly), transform_budget)), tvar);
243 if (!numerator && numerator.error().code != CasErrc::UnsupportedExpression) {
244 return Result<std::shared_ptr<SymbolicExpr>>::failure(numerator.error());
245 }
246 auto denominator = symbolic_to_poly<Rational>(detail::make_expression_ptr(detail::expand_node(detail::node(den_poly), transform_budget)), tvar);
248 return Result<std::shared_ptr<SymbolicExpr>>::failure(denominator.error());
249 }
250 if (!numerator || !denominator) { return SymbolicExpr::divide(num_poly, den_poly); }
251 auto Np = std::move(numerator.value());
252 auto Dp = std::move(denominator.value());
253 if (Dp.is_zero()) { return SymbolicExpr::divide(num_poly, den_poly); }
254 auto g = Polynomial<Rational>::gcd(Np, Dp);
255 if (g.degree() >= 1) {
256 auto [q1, r1] = Np.div_mod(g);
257 auto [q2, r2] = Dp.div_mod(g);
258 if (r1.is_zero() && r2.is_zero()) { Np = q1; Dp = q2; }
259 }
260 auto np_expr = poly_to_symbolic(Np);
261 auto dp_expr = poly_to_symbolic(Dp);
262 return SymbolicExpr::divide(np_expr, dp_expr);
263} catch (const CasError& error) {
264 return Result<std::shared_ptr<SymbolicExpr>>::failure(error);
265}
static Polynomial gcd(Polynomial a, Polynomial b)
计算两个多项式的最大公因式
SymbolicNodePtr expand_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const ExprPtr & denominator

引用了 LMCAS::context, LMCAS::denominator, LMCAS::detail::expand_node(), LMCAS::Polynomial< CoeffType >::gcd(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::UnsupportedExpression , 以及 weier_reduce_rational().

被这些函数引用 weier_reduce_rational().

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

◆ weier_replace()

std::shared_ptr< const SymbolicNode > LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & var,
const std::string & tvar )

其它函数:递归替换参数

在文件 integration_weierstrass.cpp 第 132 行定义.

133 {
134 if (!node) { return node; }
135 if (auto fn = std::dynamic_pointer_cast<const FunctionNode>(node)) {
136 auto replaced = weier_replace_function(*fn, var, tvar);
137 if (replaced) { return replaced; }
138 /// 其它函数:递归替换参数
139 std::vector<std::shared_ptr<const SymbolicNode>> new_args;
140 for (auto& a : fn->arguments()) new_args.push_back(weier_replace(a, var, tvar));
141 return LMCAS::detail::make_node<FunctionNode>(fn->type(), new_args);
142 }
143 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
144 std::vector<std::shared_ptr<const SymbolicNode>> ops;
145 for (auto& op : add->operands()) ops.push_back(weier_replace(op, var, tvar));
147 }
148 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
149 std::vector<std::shared_ptr<const SymbolicNode>> ops;
150 for (auto& op : mul->operands()) ops.push_back(weier_replace(op, var, tvar));
152 }
153 if (auto pw = std::dynamic_pointer_cast<const PowerNode>(node)) {
154 return LMCAS::detail::make_node<PowerNode>(weier_replace(pw->base(), var, tvar),
155 weier_replace(pw->exponent(), var, tvar));
156 }
157 return node->clone();
158}
std::shared_ptr< const SymbolicNode > weier_replace_function(const FunctionNode &fn, const std::string &var, const std::string &tvar)
std::shared_ptr< const SymbolicNode > weier_replace(const std::shared_ptr< const SymbolicNode > &node, const std::string &var, const std::string &tvar)
std::shared_ptr< const Node > make_node(Args &&... args)

引用了 LMCAS::a, LMCAS::add(), LMCAS::SymbolicNode::clone(), LMCAS::detail::make_node(), LMCAS::mul(), LMCAS::op, weier_replace() , 以及 weier_replace_function().

被这些函数引用 weier_replace().

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

◆ weier_replace_function()

std::shared_ptr< const SymbolicNode > LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_replace_function ( const FunctionNode & fn,
const std::string & var,
const std::string & tvar )

< 多项式 1+t^2。

< 多项式 1-t^2。

在文件 integration_weierstrass.cpp 第 92 行定义.

93 {
94 using FT = FunctionNode::FuncType;
95 if (fn.arguments().size() != 1) {
96 return nullptr;
97 }
98 auto av = std::dynamic_pointer_cast<const VariableNode>(fn.arguments()[0]);
99 if (!av || av->is_constant() || av->name() != var) {
100 return nullptr;
101 }
102 auto t = SymbolicExpr::variable(tvar);
103 auto one = SymbolicExpr::number(1);
104 auto t2 = SymbolicExpr::power(t, SymbolicExpr::number(2));
105 auto onep = SymbolicExpr::add(one, t2); /**< 多项式 1+t^2。 */
106 auto onem = SymbolicExpr::add(one, SymbolicExpr::multiply(SymbolicExpr::number(-1), t2)); /**< 多项式 1-t^2。 */
107 auto two_t = SymbolicExpr::multiply(SymbolicExpr::number(2), t);
108 switch (fn.type()) {
109 case FT::Sin: {
110 return LMCAS::detail::node(SymbolicExpr::divide(two_t, onep));
111 }
112 case FT::Cos: {
113 return LMCAS::detail::node(SymbolicExpr::divide(onem, onep));
114 }
115 case FT::Tan: {
116 return LMCAS::detail::node(SymbolicExpr::divide(two_t, onem));
117 }
118 case FT::Csc: {
119 return LMCAS::detail::node(SymbolicExpr::divide(onep, two_t));
120 }
121 case FT::Sec: {
122 return LMCAS::detail::node(SymbolicExpr::divide(onep, onem));
123 }
124 case FT::Cot: {
125 return LMCAS::detail::node(SymbolicExpr::divide(onem, two_t));
126 }
127 default: break;
128 }
129 return nullptr;
130}
FuncType type() const noexcept
__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

引用了 LMCAS::FunctionNode::arguments(), LMCAS::detail::node(), LMCAS::t, LMCAS::FunctionNode::type() , 以及 weier_replace_function().

被这些函数引用 weier_replace() , 以及 weier_replace_function().

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

◆ weier_to_rational()

std::optional< RatPair > LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_to_rational ( const std::shared_ptr< const SymbolicNode > & node,
const std::string & tvar,
ComputationContext & context )

累加:a/b + c/d = (a*d + c*b)/(b*d)

其他节点结构由 nullopt 标记为 t 有理函数域之外.

在文件 integration_weierstrass.cpp 第 190 行定义.

191 {
192
193 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
194 (context).limits().max_ast_nodes, "transform");
195 auto one = SymbolicExpr::number(1);
196 if (!node) { return RatPair{SymbolicExpr::number(0), one}; }
197
198 if (std::dynamic_pointer_cast<const NumberNode>(node) ||
199 std::dynamic_pointer_cast<const VariableNode>(node)) {
200 return RatPair{LMCAS::detail::make_expression_ptr(node->clone()), one};
201 }
202 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
203 /// 累加:a/b + c/d = (a*d + c*b)/(b*d)
204 std::shared_ptr<SymbolicExpr> num = SymbolicExpr::number(0);
205 std::shared_ptr<SymbolicExpr> den = one;
206 for (auto& op : add->operands()) {
207 auto r = weier_to_rational(op, tvar, context);
208 if (!r) { return std::nullopt; }
209 auto [n2, d2] = *r;
210 auto new_num = SymbolicExpr::add(
211 SymbolicExpr::multiply(num, d2), SymbolicExpr::multiply(n2, den));
212 den = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(den, d2)), transform_budget));
214 }
215 return RatPair{num, den};
216 }
217 if (auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
218 std::shared_ptr<SymbolicExpr> num = one;
219 std::shared_ptr<SymbolicExpr> den = one;
220 for (auto& op : mul->operands()) {
221 auto r = weier_to_rational(op, tvar, context);
222 if (!r) { return std::nullopt; }
223 auto [n2, d2] = *r;
224 num = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(num, n2)), transform_budget));
225 den = detail::make_expression_ptr(detail::normalize_node(detail::node(SymbolicExpr::multiply(den, d2)), transform_budget));
226 }
227 return RatPair{num, den};
228 }
229 if (auto pw = std::dynamic_pointer_cast<const PowerNode>(node)) {
230 return weier_rational_power(*pw, tvar, one, context);
231 }
232 /// 其他节点结构由 nullopt 标记为 t 有理函数域之外.
233 return std::nullopt;
234}
std::optional< RatPair > weier_rational_power(const PowerNode &pw, const std::string &tvar, const std::shared_ptr< SymbolicExpr > &one, ComputationContext &context)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r

引用了 LMCAS::add(), LMCAS::SymbolicNode::clone(), LMCAS::context, LMCAS::detail::make_expression_ptr(), LMCAS::mul(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::polynomial_solver_detail::num(), LMCAS::op, LMCAS::r, weier_rational_power() , 以及 weier_to_rational().

被这些函数引用 weier_rational_power() , 以及 weier_to_rational().

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

◆ weier_trig_function()

bool LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_trig_function ( const FunctionNode & fn)

在文件 integration_weierstrass.cpp 第 9 行定义.

9 {
10 using FT = FunctionNode::FuncType;
11 if (fn.arguments().size() != 1) {
12 return false;
13 }
14 return fn.type() == FT::Sin || fn.type() == FT::Cos ||
15 fn.type() == FT::Tan || fn.type() == FT::Sec ||
16 fn.type() == FT::Csc || fn.type() == FT::Cot;
17}

引用了 LMCAS::FunctionNode::arguments(), LMCAS::FunctionNode::type() , 以及 weier_trig_function().

被这些函数引用 weier_rational_function(), weier_trig_function() , 以及 weier_trig_of_variable().

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

◆ weier_trig_of_variable()

bool LMCAS::anonymous_namespace{integration_weierstrass.cpp}::weier_trig_of_variable ( const FunctionNode & function,
const std::string & var )

在文件 integration_weierstrass.cpp 第 60 行定义.

60 {
62 return false;
63 }
64 auto argument = std::dynamic_pointer_cast<const VariableNode>(function.arguments()[0]);
65 return argument && !argument->is_constant() && argument->name() == var;
66}
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::function(), weier_trig_function() , 以及 weier_trig_of_variable().

被这些函数引用 weier_has_trig_of_var() , 以及 weier_trig_of_variable().

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