14 std::shared_ptr<SymbolicExpr> sum =
nullptr;
15 for (
const auto& comp :
v) {
19 auto sq = SymbolicExpr::power(comp, SymbolicExpr::number(2));
24 sum = SymbolicExpr::add(sum, sq);
29 return SymbolicExpr::number(0);
35 const std::shared_ptr<SymbolicExpr>& f,
36 const std::vector<std::string>&
vars,
40 std::shared_ptr<SymbolicExpr> sum =
nullptr;
41 for (
size_t i = 0; i <
vars.size(); ++i) {
47 auto term = SymbolicExpr::multiply(partial, unit_dir[i]);
52 sum = SymbolicExpr::add(sum, term);
57 return SymbolicExpr::number(0);
63 const std::shared_ptr<SymbolicExpr>& f,
64 const std::vector<std::string>&
vars,
70 context.limits().max_ast_nodes,
"directional_derivative");
71 const std::string operation =
"directional_derivative";
82 "directional derivative order must be positive",
90 "direction magnitude construction failed",
93 if (mag_sq->is_zero()) {
95 "direction vector cannot be zero",
98 auto step =
context.consume_steps(
vars.size() *
static_cast<std::size_t
>(
order),
107 }
catch (
const std::bad_alloc&) {
109 "vector calculus allocation failed",
111 }
catch (
const std::length_error& error) {
113 }
catch (
const std::exception&
e) {
119 const std::shared_ptr<SymbolicExpr>& f,
120 const std::vector<std::string>&
vars,
129 const std::shared_ptr<SymbolicExpr>& f,
const std::vector<std::string>&
vars,
134 throw std::invalid_argument(
"directional_derivative: f must not be null");
137 throw std::invalid_argument(
138 "directional_derivative: direction and vars must have the same dimension");
141 throw std::invalid_argument(
142 "directional_derivative: order must be >= 1");
146 if (!mag_sq || mag_sq->is_zero()) {
150 auto magnitude = SymbolicExpr::sqrt(mag_sq);
155 if (!comp || comp->is_zero()) {
156 unit_dir.push_back(SymbolicExpr::number(0));
158 auto u_comp = SymbolicExpr::multiply(
160 SymbolicExpr::power(magnitude, SymbolicExpr::number(-1)));
162 unit_dir.push_back(u_comp);
167 for (
int k = 0; k <
order; ++k) {
170 return SymbolicExpr::number(0);
179 const std::shared_ptr<SymbolicExpr>& f,
const std::vector<std::string>&
vars,
184 context.limits().max_ast_nodes,
"directional_derivative");
static Result failure(CasErrc code, std::string message, std::string operation={})
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
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)
Result< void > vector_calculus_validate_expr_vars(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
std::shared_ptr< SymbolicExpr > directional_derivative_impl(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult vector_calculus_wrap_expr(std::shared_ptr< SymbolicExpr > expr, const std::string &operation)
Result< void > vector_calculus_validate_field_vars(const VectorField &field, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
__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
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
__attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorField gradient(const std const std::vector< std::string > & vars
const std::vector< FGLMPoly > const MonomialOrder & order
const std::string const LimitExprPtr LimitDirection direction
std::shared_ptr< SymbolicExpr > directional_derivative(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order)
static std::shared_ptr< SymbolicExpr > vector_calculus_magnitude_squared(const VectorField &v, detail::RewriteBudget &transform_budget)
static std::shared_ptr< SymbolicExpr > vector_calculus_single_dir_deriv(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &unit_dir, detail::RewriteBudget &transform_budget)
std::vector< std::shared_ptr< SymbolicExpr > > VectorField
向量场由标量表达式组成。
Result< std::shared_ptr< SymbolicExpr > > VectorCalculusExprResult
VectorCalculusExprResult directional_derivative_checked(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order, ComputationContext &context)