LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
vector_calculus_curves.cpp
浏览该文件的文档.
4#include "integration.hpp"
5#include <stdexcept>
6
7namespace LMCAS {
8
9using namespace vector_calculus_detail;
10
12 const std::shared_ptr<SymbolicExpr>& f, const VectorField& parametrization,
13 const std::string& t, const std::shared_ptr<SymbolicExpr>& a,
14 const std::shared_ptr<SymbolicExpr>& b,
16{
17 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
18 context.limits().max_ast_nodes, "curve_integral_scalar");
19 const std::string operation = "curve_integral_scalar";
21 f, parametrization, t, a, b, context, operation);
22 if (!valid) {
23 return VectorCalculusExprResult::failure(valid.error());
24 }
25
26 auto step = context.consume_steps(parametrization.size() * 4 + 4, operation);
27 if (!step) {
28 return VectorCalculusExprResult::failure(step.error());
29 }
30
31 try {
32 return curve_integral_scalar_strict(f, parametrization, t, a, b, context, operation, transform_budget);
33 } catch (const CasError& error) {
35 } catch (const std::bad_alloc&) {
37 "curve integral allocation failed",
38 operation);
39 } catch (const std::length_error& error) {
40 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
41 } catch (const std::exception& e) {
43 }
44}
45
47 const std::shared_ptr<SymbolicExpr>& f, const VectorField& parametrization,
48 const std::string& t, const std::shared_ptr<SymbolicExpr>& a,
49 const std::shared_ptr<SymbolicExpr>& b)
50{
53}
54
55std::shared_ptr<SymbolicExpr> curve_integral_scalar(
56 const std::shared_ptr<SymbolicExpr>& f, const VectorField& parametrization,
57 const std::string& t, const std::shared_ptr<SymbolicExpr>& a,
58 const std::shared_ptr<SymbolicExpr>& b)
59{
61 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
62 (context).limits().max_ast_nodes, "transform");
63 if (!f) {
64 throw std::invalid_argument("curve_integral_scalar: f must not be null");
65 }
66 if (parametrization.empty()) {
67 throw std::invalid_argument("curve_integral_scalar: parametrization must not be empty");
68 }
69 if (!a || !b) {
70 throw std::invalid_argument("curve_integral_scalar: bounds must not be null");
71 }
72
73 size_t dim = parametrization.size();
74 auto coord_vars = vector_calculus_coord_vars(dim);
75
76 auto f_composed = f;
77 for (size_t i = 0; i < dim; ++i) {
78 f_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(f_composed), coord_vars[i], detail::node(parametrization[i]), transform_budget));
79 }
80 f_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(f_composed), transform_budget));
81
82 std::shared_ptr<SymbolicExpr> speed_sq = nullptr;
83 for (size_t i = 0; i < dim; ++i) {
85 if (!deriv) {
86 continue;
87 }
88 deriv = detail::make_expression_ptr(detail::normalize_node(detail::node(deriv), transform_budget));
89 auto sq = SymbolicExpr::power(deriv, SymbolicExpr::number(2));
91 if (!speed_sq) {
92 speed_sq = sq;
93 } else {
94 speed_sq = SymbolicExpr::add(speed_sq, sq);
95 speed_sq = detail::make_expression_ptr(detail::normalize_node(detail::node(speed_sq), transform_budget));
96 }
97 }
98
99 if (!speed_sq) {
100 return SymbolicExpr::number(0);
101 }
102
103 auto speed = SymbolicExpr::sqrt(speed_sq);
104 speed = detail::make_expression_ptr(detail::normalize_node(detail::node(speed), transform_budget));
105
106 auto integrand = SymbolicExpr::multiply(f_composed, speed);
107 integrand = detail::make_expression_ptr(detail::normalize_node(detail::node(integrand), transform_budget));
108
109
110 return vector_calculus_integrate_with_fallback(integrand, t, a, b, context, transform_budget);
111}
112
113
115 const VectorField& F, const VectorField& parametrization,
116 const std::string& t, const std::shared_ptr<SymbolicExpr>& a,
117 const std::shared_ptr<SymbolicExpr>& b,
119{
120 detail::RewriteBudget transform_budget(context, context.limits().max_recursion_depth,
121 context.limits().max_ast_nodes, "curve_integral_vector");
122 const std::string operation = "curve_integral_vector";
124 F, parametrization, t, a, b, context, operation);
125 if (!valid) {
126 return VectorCalculusExprResult::failure(valid.error());
127 }
128
129 auto step = context.consume_steps(F.size() * parametrization.size() +
130 parametrization.size() * 3 + 4,
131 operation);
132 if (!step) {
133 return VectorCalculusExprResult::failure(step.error());
134 }
135
136 try {
137 return curve_integral_vector_strict(F, parametrization, t, a, b, context, operation, transform_budget);
138 } catch (const CasError& error) {
140 } catch (const std::bad_alloc&) {
142 "curve integral allocation failed",
143 operation);
144 } catch (const std::length_error& error) {
145 return VectorCalculusExprResult::failure(CasErrc::ResourceLimit, error.what(), operation);
146 } catch (const std::exception& e) {
148 }
149}
150
152 const VectorField& F, const VectorField& parametrization,
153 const std::string& t, const std::shared_ptr<SymbolicExpr>& a,
154 const std::shared_ptr<SymbolicExpr>& b)
155{
158}
159
160std::shared_ptr<SymbolicExpr> curve_integral_vector(
161 const VectorField& F, const VectorField& parametrization,
162 const std::string& t, const std::shared_ptr<SymbolicExpr>& a,
163 const std::shared_ptr<SymbolicExpr>& b)
164{
166 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
167 (context).limits().max_ast_nodes, "transform");
168 if (F.empty()) {
169 throw std::invalid_argument("curve_integral_vector: F must not be empty");
170 }
171 if (parametrization.empty()) {
172 throw std::invalid_argument("curve_integral_vector: parametrization must not be empty");
173 }
174 if (F.size() != parametrization.size()) {
175 throw std::invalid_argument(
176 "curve_integral_vector: F and parametrization must have the same dimension");
177 }
178 if (!a || !b) {
179 throw std::invalid_argument("curve_integral_vector: bounds must not be null");
180 }
181
182 size_t dim = parametrization.size();
183 auto coord_vars = vector_calculus_coord_vars(dim);
184
185 std::shared_ptr<SymbolicExpr> dot_product = nullptr;
186 for (size_t i = 0; i < dim; ++i) {
187 if (!F[i]) {
188 continue;
189 }
190
191 auto Fi_composed = F[i];
192 for (size_t j = 0; j < dim; ++j) {
193 Fi_composed = detail::make_expression_ptr(detail::substitute_node(detail::node(Fi_composed), coord_vars[j], detail::node(parametrization[j]), transform_budget));
194 }
195 Fi_composed = detail::make_expression_ptr(detail::normalize_node(detail::node(Fi_composed), transform_budget));
196
198 if (!ri_prime) {
199 continue;
200 }
201 ri_prime = detail::make_expression_ptr(detail::normalize_node(detail::node(ri_prime), transform_budget));
202
203 auto term = SymbolicExpr::multiply(Fi_composed, ri_prime);
204 term = detail::make_expression_ptr(detail::normalize_node(detail::node(term), transform_budget));
205
206 if (!dot_product) {
207 dot_product = term;
208 } else {
209 dot_product = SymbolicExpr::add(dot_product, term);
211 }
212 }
213
214 if (!dot_product) {
215 return SymbolicExpr::number(0);
216 }
217
218
219 return vector_calculus_integrate_with_fallback(dot_product, t, a, b, context, transform_budget);
220}
221
222}
static Result failure(CasErrc code, std::string message, std::string operation={})
Symbolic integration APIs.
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)
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
Result< void > vector_calculus_validate_curve_scalar_inputs(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
std::vector< std::string > vector_calculus_coord_vars(std::size_t dimension)
VectorCalculusExprResult curve_integral_scalar_strict(const std::shared_ptr< SymbolicExpr > &function, const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > vector_calculus_integrate_with_fallback(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, detail::RewriteBudget &transform_budget)
Result< void > vector_calculus_validate_curve_vector_inputs(const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult curve_integral_vector_strict(const VectorField &field, const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult curve_integral_scalar_checked(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
ExprResult e()
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
VectorCalculusExprResult curve_integral_vector_checked(const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context)
const MultiPoly & b
__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
向量场由标量表达式组成。
__attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std int dim
__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 & parametrization
Result< std::shared_ptr< SymbolicExpr > > VectorCalculusExprResult
std::shared_ptr< SymbolicExpr > curve_integral_vector(const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
std::shared_ptr< SymbolicExpr > curve_integral_scalar(const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b)
__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
VectorCalculusExprResult dot_product(const VectorField &a, const VectorField &b)