13 if (
a.size() !=
b.size()) {
16 "vectors must have the same dimension",
19 std::shared_ptr<SymbolicExpr> sum = SymbolicExpr::number(0);
20 for (
size_t i = 0; i <
a.size(); ++i) {
21 if (!
a[i] || !
b[i])
continue;
22 sum = SymbolicExpr::add(sum, SymbolicExpr::multiply(
a[i],
b[i]));
27std::shared_ptr<SymbolicExpr>
30 static constexpr std::size_t first[] = {1, 2, 0};
31 static constexpr std::size_t second[] = {2, 0, 1};
32 return SymbolicExpr::add(
33 SymbolicExpr::multiply(left[first[index]],
right[second[index]]),
34 SymbolicExpr::multiply(
35 SymbolicExpr::number(-1),
36 SymbolicExpr::multiply(
37 left[second[index]],
right[first[index]])));
42 if (
a.size() != 3 ||
b.size() != 3) {
45 "vectors must be three-dimensional",
50 for (std::size_t index = 0; index < 3; ++index) {
59 if (
a.size() !=
b.size()) {
62 "vectors must have the same dimension",
67 auto bb = bb_result.value();
74 auto ab = ab_result.value();
75 auto coeff = SymbolicExpr::divide(ab, bb);
77 result.reserve(
b.size());
78 for (
const auto& comp :
b) {
87 if (!bb_result)
return bb_result;
88 auto bb = bb_result.value();
93 if (!ab_result)
return ab_result;
108 auto aa = aa_result.value();
109 auto bb = bb_result.value();
118 auto denom = SymbolicExpr::multiply(SymbolicExpr::sqrt(aa), SymbolicExpr::sqrt(bb));
119 auto cos_theta = SymbolicExpr::divide(ab_result.value(), denom);
139 context.limits().max_ast_nodes,
"dot_product");
141}
catch (
const CasError& error) {
143}
catch (
const std::bad_alloc&) {
145 "vector calculus allocation failed",
"dot_product");
146}
catch (
const std::length_error& error) {
148}
catch (
const std::exception& error) {
156 context.limits().max_ast_nodes,
"cross_product");
158}
catch (
const CasError& error) {
160}
catch (
const std::bad_alloc&) {
162 "vector calculus allocation failed",
"cross_product");
163}
catch (
const std::length_error& error) {
165}
catch (
const std::exception& error) {
172 context.limits().max_ast_nodes,
"vector_project");
174}
catch (
const CasError& error) {
176}
catch (
const std::bad_alloc&) {
178 "vector calculus allocation failed",
"vector_project");
179}
catch (
const std::length_error& error) {
181}
catch (
const std::exception& error) {
188 context.limits().max_ast_nodes,
"scalar_project");
190}
catch (
const CasError& error) {
192}
catch (
const std::bad_alloc&) {
194 "vector calculus allocation failed",
"scalar_project");
195}
catch (
const std::length_error& error) {
197}
catch (
const std::exception& error) {
204 context.limits().max_ast_nodes,
"vector_angle_symbolic");
206}
catch (
const CasError& error) {
208}
catch (
const std::bad_alloc&) {
210 "vector calculus allocation failed",
"vector_angle_symbolic");
211}
catch (
const std::length_error& error) {
213}
catch (
const std::exception& error) {
221 context.limits().max_ast_nodes,
"mixed_product");
223}
catch (
const CasError& error) {
225}
catch (
const std::bad_alloc&) {
227 "vector calculus allocation failed",
"mixed_product");
228}
catch (
const std::length_error& error) {
230}
catch (
const std::exception& error) {
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(std::shared_ptr< SymbolicExpr > value)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr< SymbolicExpr > vector_calculus_cross_component(const VectorField &left, const VectorField &right, std::size_t index)
static VectorCalculusFieldResult cross_product_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
static VectorCalculusExprResult scalar_project_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
const VectorField const VectorField & c
static VectorCalculusExprResult mixed_product_impl(const VectorField &a, const VectorField &b, const VectorField &c, detail::RewriteBudget &transform_budget)
__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
std::vector< std::shared_ptr< SymbolicExpr > > VectorField
向量场由标量表达式组成。
Result< VectorField > VectorCalculusFieldResult
VectorCalculusExprResult vector_angle_symbolic(const VectorField &a, const VectorField &b)
VectorCalculusExprResult scalar_project(const VectorField &a, const VectorField &b)
VectorCalculusFieldResult vector_project(const VectorField &a, const VectorField &b)
static VectorCalculusFieldResult vector_project_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
Result< std::shared_ptr< SymbolicExpr > > VectorCalculusExprResult
VectorCalculusExprResult mixed_product(const VectorField &a, const VectorField &b, const VectorField &c)
VectorCalculusFieldResult cross_product(const VectorField &a, const VectorField &b)
static VectorCalculusExprResult dot_product_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult dot_product(const VectorField &a, const VectorField &b)
static VectorCalculusExprResult vector_angle_symbolic_impl(const VectorField &a, const VectorField &b, detail::RewriteBudget &transform_budget)