LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
numeric_evaluation_functions.cpp
浏览该文件的文档.
1
#include "
internal/numeric_evaluation_support.hpp
"
2
#include "lmmc/numeric.h"
3
#include <cmath>
4
#include <optional>
5
6
namespace
LMCAS::detail
{
7
namespace
{
8
9
std::optional<Result<ApproxReal>>
trigonometric
(
FunctionNode::FuncType
type,
double
x) {
10
switch
(type) {
11
case
FunctionNode::FuncType::Sin
: {
12
return
numeric_approximation
(std::sin(x));
13
}
14
case
FunctionNode::FuncType::Cos
: {
15
return
numeric_approximation
(std::cos(x));
16
}
17
case
FunctionNode::FuncType::Tan
: {
18
return
numeric_approximation
(std::tan(x));
19
}
20
case
FunctionNode::FuncType::Cot
: {
21
if
(std::sin(x) == 0.0) {
22
return
numeric_failure
(
CasErrc::DomainError
,
"cot is undefined"
);
23
}
24
return
numeric_approximation
(1.0 / std::tan(x));
25
}
26
case
FunctionNode::FuncType::Sec
: {
27
if
(std::cos(x) == 0.0) {
28
return
numeric_failure
(
CasErrc::DomainError
,
"sec is undefined"
);
29
}
30
return
numeric_approximation
(1.0 / std::cos(x));
31
}
32
case
FunctionNode::FuncType::Csc
: {
33
if
(std::sin(x) == 0.0) {
34
return
numeric_failure
(
CasErrc::DomainError
,
"csc is undefined"
);
35
}
36
return
numeric_approximation
(1.0 / std::sin(x));
37
}
38
default
: {
39
return
std::nullopt;
40
}
41
}
42
}
43
44
std::optional<Result<ApproxReal>>
inverse_trigonometric
(
FunctionNode::FuncType
type,
double
x) {
45
switch
(type) {
46
case
FunctionNode::FuncType::ArcSin
: {
47
if
(x < -1.0 || x > 1.0) {
48
return
numeric_failure
(
CasErrc::DomainError
,
"asin real domain is [-1, 1]"
);
49
}
50
return
numeric_approximation
(std::asin(x));
51
}
52
case
FunctionNode::FuncType::ArcCos
: {
53
if
(x < -1.0 || x > 1.0) {
54
return
numeric_failure
(
CasErrc::DomainError
,
"acos real domain is [-1, 1]"
);
55
}
56
return
numeric_approximation
(std::acos(x));
57
}
58
case
FunctionNode::FuncType::ArcTan
: {
59
return
numeric_approximation
(std::atan(x));
60
}
61
default
: {
62
return
std::nullopt;
63
}
64
}
65
}
66
67
std::optional<Result<ApproxReal>>
hyperbolic
(
FunctionNode::FuncType
type,
double
x) {
68
switch
(type) {
69
case
FunctionNode::FuncType::Sinh
: {
70
return
numeric_approximation
(std::sinh(x));
71
}
72
case
FunctionNode::FuncType::Cosh
: {
73
return
numeric_approximation
(std::cosh(x));
74
}
75
case
FunctionNode::FuncType::Tanh
: {
76
return
numeric_approximation
(std::tanh(x));
77
}
78
default
: {
79
return
std::nullopt;
80
}
81
}
82
}
83
84
std::optional<Result<ApproxReal>>
elementary
(
FunctionNode::FuncType
type,
double
x) {
85
switch
(type) {
86
case
FunctionNode::FuncType::Ln
:
87
case
FunctionNode::FuncType::Log
: {
88
if
(x <= 0.0) {
89
return
numeric_failure
(
CasErrc::DomainError
,
"logarithm requires a positive real argument"
);
90
}
91
return
numeric_approximation
(std::log(x));
92
}
93
case
FunctionNode::FuncType::Abs
: {
94
return
numeric_approximation
(std::abs(x));
95
}
96
case
FunctionNode::FuncType::Sqrt
: {
97
if
(x < 0.0) {
98
return
numeric_failure
(
CasErrc::DomainError
,
"real square root requires a non-negative argument"
);
99
}
100
return
numeric_approximation
(std::sqrt(x));
101
}
102
case
FunctionNode::FuncType::Exp
: {
103
return
numeric_approximation
(std::exp(x));
104
}
105
case
FunctionNode::FuncType::Sgn
: {
106
return
numeric_approximation
((x > 0.0) - (x < 0.0));
107
}
108
case
FunctionNode::FuncType::Floor
: {
109
return
numeric_approximation
(std::floor(x));
110
}
111
case
FunctionNode::FuncType::Ceil
: {
112
return
numeric_approximation
(std::ceil(x));
113
}
114
case
FunctionNode::FuncType::Round
: {
115
return
numeric_approximation
(std::round(x));
116
}
117
default
: {
118
return
std::nullopt;
119
}
120
}
121
}
122
123
std::optional<Result<ApproxReal>>
special
(
FunctionNode::FuncType
type,
double
x) {
124
switch
(type) {
125
case
FunctionNode::FuncType::Erf
: {
126
return
numeric_approximation
(std::erf(x));
127
}
128
case
FunctionNode::FuncType::LambertW
: {
129
lmmc_real_t
value
= 0.0;
130
const
auto
status = lmmc_lambertw(
static_cast<
lmmc_real_t
>
(x), &
value
);
131
if
(status == LMMC_STATUS_INVALID_ARGUMENT) {
132
return
numeric_failure
(
CasErrc::DomainError
,
"LambertW argument is outside the real branch"
);
133
}
134
if
(status == LMMC_STATUS_CONVERGENCE_FAILED) {
135
return
numeric_failure
(
CasErrc::NumericFailure
,
"LambertW failed to certify convergence"
);
136
}
137
if
(status == LMMC_STATUS_NUMERICAL_FAILURE) {
138
return
numeric_failure
(
CasErrc::NumericFailure
,
"LambertW encountered a nonfinite numerical value"
);
139
}
140
if
(status != LMMC_STATUS_OK) {
141
return
numeric_failure
(
CasErrc::InternalInvariant
,
"Unexpected LambertW status"
);
142
}
143
return
numeric_approximation
(
static_cast<
double
>
(
value
));
144
}
145
case
FunctionNode::FuncType::RealPart
:
146
case
FunctionNode::FuncType::Conjugate
: {
147
return
numeric_approximation
(x);
148
}
149
case
FunctionNode::FuncType::ComplexArg
: {
150
return
numeric_approximation
(std::atan2(0.0, x));
151
}
152
case
FunctionNode::FuncType::ImagPart
: {
153
return
numeric_approximation
(0.0);
154
}
155
case
FunctionNode::FuncType::ComplexAbs
: {
156
return
numeric_approximation
(std::abs(x));
157
}
158
default
: {
159
return
std::nullopt;
160
}
161
}
162
}
163
164
}
165
166
Result<ApproxReal>
evaluate_unary_numeric
(
FunctionNode::FuncType
type,
double
x) {
167
auto
evaluated = trigonometric(type, x);
168
if
(!evaluated) {
169
evaluated = inverse_trigonometric(type, x);
170
}
171
if
(!evaluated) {
172
evaluated = hyperbolic(type, x);
173
}
174
if
(!evaluated) {
175
evaluated = elementary(type, x);
176
}
177
if
(!evaluated) {
178
evaluated = special(type, x);
179
}
180
if
(!evaluated) {
181
return
numeric_failure
(
CasErrc::UnsupportedExpression
,
182
"function is not supported by real numeric evaluation"
);
183
}
184
return
std::move(*evaluated);
185
}
186
187
}
LMCAS::FunctionNode::FuncType
FuncType
定义
functions.hpp:12
LMCAS::FunctionNode::FuncType::Sin
@ Sin
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::Tan
@ Tan
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::ImagPart
@ ImagPart
虚部 Im(z)。
定义
functions.hpp:33
LMCAS::FunctionNode::FuncType::Abs
@ Abs
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::Sec
@ Sec
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::ComplexAbs
@ ComplexAbs
复数模 |z|。
定义
functions.hpp:35
LMCAS::FunctionNode::FuncType::Conjugate
@ Conjugate
共轭 conj(z)。
定义
functions.hpp:34
LMCAS::FunctionNode::FuncType::Cosh
@ Cosh
定义
functions.hpp:15
LMCAS::FunctionNode::FuncType::Csc
@ Csc
三角函数。
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::Sinh
@ Sinh
定义
functions.hpp:15
LMCAS::FunctionNode::FuncType::Ln
@ Ln
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::Sqrt
@ Sqrt
对数、绝对值、平方根。
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::ArcSin
@ ArcSin
定义
functions.hpp:14
LMCAS::FunctionNode::FuncType::Round
@ Round
四舍五入 round(x)。
定义
functions.hpp:31
LMCAS::FunctionNode::FuncType::Ceil
@ Ceil
上取整 ⌈x⌉。
定义
functions.hpp:30
LMCAS::FunctionNode::FuncType::ArcCos
@ ArcCos
定义
functions.hpp:14
LMCAS::FunctionNode::FuncType::ComplexArg
@ ComplexArg
复数辐角 arg(z)。
定义
functions.hpp:36
LMCAS::FunctionNode::FuncType::RealPart
@ RealPart
实部 Re(z)。
定义
functions.hpp:32
LMCAS::FunctionNode::FuncType::Exp
@ Exp
指数函数。
定义
functions.hpp:17
LMCAS::FunctionNode::FuncType::Cot
@ Cot
定义
functions.hpp:13
LMCAS::FunctionNode::FuncType::Tanh
@ Tanh
双曲函数。
定义
functions.hpp:15
LMCAS::FunctionNode::FuncType::Log
@ Log
定义
functions.hpp:16
LMCAS::FunctionNode::FuncType::ArcTan
@ ArcTan
反三角函数。
定义
functions.hpp:14
LMCAS::FunctionNode::FuncType::LambertW
@ LambertW
Lambert W 函数。
定义
functions.hpp:18
LMCAS::FunctionNode::FuncType::Erf
@ Erf
误差函数 erf(x) = (2/√π)∫₀ˣ e^(-t²) dt。
定义
functions.hpp:21
LMCAS::FunctionNode::FuncType::Floor
@ Floor
下取整 ⌊x⌋。
定义
functions.hpp:29
LMCAS::FunctionNode::FuncType::Sgn
@ Sgn
符号函数 sgn(x) ∈ {-1, 0, 1}。
定义
functions.hpp:28
LMCAS::FunctionNode::FuncType::Cos
@ Cos
定义
functions.hpp:13
LMCAS::Result
定义
result.hpp:39
LMCAS::detail::anonymous_namespace{numeric_evaluation_functions.cpp}::elementary
std::optional< Result< ApproxReal > > elementary(FunctionNode::FuncType type, double x)
定义
numeric_evaluation_functions.cpp:84
LMCAS::detail::anonymous_namespace{numeric_evaluation_functions.cpp}::hyperbolic
std::optional< Result< ApproxReal > > hyperbolic(FunctionNode::FuncType type, double x)
定义
numeric_evaluation_functions.cpp:67
LMCAS::detail::anonymous_namespace{numeric_evaluation_functions.cpp}::special
std::optional< Result< ApproxReal > > special(FunctionNode::FuncType type, double x)
定义
numeric_evaluation_functions.cpp:123
LMCAS::detail::anonymous_namespace{numeric_evaluation_functions.cpp}::inverse_trigonometric
std::optional< Result< ApproxReal > > inverse_trigonometric(FunctionNode::FuncType type, double x)
定义
numeric_evaluation_functions.cpp:44
LMCAS::detail::anonymous_namespace{numeric_evaluation_functions.cpp}::trigonometric
std::optional< Result< ApproxReal > > trigonometric(FunctionNode::FuncType type, double x)
定义
numeric_evaluation_functions.cpp:9
LMCAS::detail
多元 Hensel 提升(单变量步)
定义
assumption_context.hpp:31
LMCAS::detail::numeric_failure
Result< ApproxReal > numeric_failure(CasErrc code, std::string message)
定义
numeric_evaluation.cpp:24
LMCAS::detail::evaluate_unary_numeric
Result< ApproxReal > evaluate_unary_numeric(FunctionNode::FuncType type, double value)
定义
numeric_evaluation_functions.cpp:166
LMCAS::detail::numeric_approximation
Result< ApproxReal > numeric_approximation(double value)
定义
numeric_evaluation.cpp:28
LMCAS::CasErrc::UnsupportedExpression
@ UnsupportedExpression
定义
result.hpp:23
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::NumericFailure
@ NumericFailure
定义
result.hpp:27
LMCAS::CasErrc::DomainError
@ DomainError
定义
result.hpp:16
LMCAS::value
const std::string const ExprPtr & value
定义
expr.hpp:293
numeric_evaluation_support.hpp
src
numeric_evaluation_functions.cpp
生成于
, 为 LMCAS使用
1.18.0