Salam pembuka. Selama 7 bulan terakhir saya telah mengerjakan pembaruan AngouriMath terbesar . Dan ada sesuatu untuk diceritakan.
Singkatnya
Pada November 2019, saya menyadari bahwa dunia ini, lebih tepatnya dunia dotnet, tidak memiliki perpustakaan aljabar simbolis untuk menyederhanakan ekspresi, menyelesaikan persamaan, menurunkan lateks, dan sebagainya. Jadi saya memutuskan untuk membuatnya.
Tapi ada ...
Mendengar apa yang saya lakukan, orang yang berbeda muncul dengan solusi yang berbeda. Tulis ulang SymPy, buat pembungkus di atas SageMath untuk Dotnet, spiral Wolfram | Alpha, gunakan mathnet.symbolics primitif (mereka sendiri berbicara tentang keprimitifan).
Tetapi semua ini memiliki keterbatasan atau kesulitan. Hal yang sama yang saya kerjakan adalah pustaka yang sangat ringan yang ditulis dan dioptimalkan untuk .NET. Sumber terbuka, tentu saja. (di bawah MIT)
Perbarui 1.2
Pada bulan Agustus, salah satu kontributor utama @ HappyPig375 membantu menulis ulang sebagian besar pustaka ke hierarki tipe normal. Sekarang ada tipe terpisah untuk setiap operator atau fungsi. Itu adalah titik kritis, yang sebelumnya perpustakaan itu lambat, canggung, dan sama sekali tidak jelas. Sekarang mari kita bahas apa yang telah dilakukan sejak saat itu.
Ekspresi adalah rekor
Sebagai contoh, seperti inilah deklarasi operator penjumlahan
public sealed partial record Sumf(Entity Augend, Entity Addend) : NumericNode
Berkat ini, kami dapat dengan mudah menerapkan pencocokan pola baru:
internal static Entity CommonRules(Entity x) => x switch
{
// (a * f(x)) * g(x) = a * (f(x) * g(x))
Mulf(Mulf(Number const1, Function func1), Function func2) => func1 * func2 * const1,
// (a/b) * (c/d) = (a*c)/(b*d)
Mulf(Divf(var any1, var any2), Divf(var any3, var any4)) => any1 * any3 / (any2 * any4),
// a / (b / c) = a * c / b
Divf(var any1, Divf(var any2, var any3)) => any1 * any3 / any2,
(ini adalah contoh pola yang berfungsi saat menyederhanakan ekspresi)
Matematika
, .
, , , .
12 , (sinh(x)
(e.Pow(x) - e.Pow(-x)) / 2
).
Abs Signum. abs : (|x|)
. , , ( | , ).
Phi ( ).
WriteLine(@"phi(8)".EvalNumerical());
WriteLine(@"(|-3 + 4i|)".EvalNumerical());
WriteLine(@"sinh(3)".Simplify());
WriteLine(@"sec(0.5)".Simplify());
4
5
(e ^ 3 - 1 / e ^ 3) / 2
sec(1/2)
. , NaN, . - SpecialSet, .
- . - , - , . : not
, or
, xor
, and
, implies
.
, Boolean
, EvaluableBoolean
. , EvaluableNumerical
, Number
.
WriteLine(@"(true or b) implies c".Simplify());
( c
)
Boolean
, . : =
, <
, >
, <=
, >=
.
. , a > b > c
, (a > b > c
, a > b and b > c
).
WriteLine(@"a < b >= c".Simplify());
( a < b and b >= c
)
. .
- FiniteSet, , . . : { 1, 2, 3 }
.
/ : [1; 2]
, (1; 2)
, [1; 2)
, (1; 2]
. .
SpecialSet
"" . CC
, RR
, QQ
, ZZ
, BB
, , , , .
ConditionalSet
set-builder notation, : { x : x > 0 and x^2 = y }
( x
, y
).
WriteLine(@"({ 1, 2 } \/ { 5 }) /\ { x : x in [2; 3] and x > 0 } ".Simplify());
( { 2 }
)
, . .
WriteLine("tan(a x) / (b x)".Limit("x", 0));
WriteLine("(sin(t) - t) / t3".Limit("t", 0));
( a / b
-1/6
)
"Provided"
, . , sqrt(x) provided x >= 0
. x, NaN.
, NaN, . , NaN NaN.
-
Piecewise
- Provided
. -, , Piecewise
, Provided
, .
, Piecewise
:
Entity abs = "piecewise(x provided x > 0, -x provided x <= 0)";
WriteLine(abs.Substitute("x", 3).EvalNumerical());
WriteLine(abs.Substitute("x", -3).EvalNumerical());
( 3 )
, / .
, , AngouriMathBaseException
. p/invoke
- - , , , AngouriMathBaseException
, . , , catch- ( ).
F#
API AngouriMath F#. , , F# . - , .
Interactive
, AngouriMath Jupyter. AngouriMath.Interactive ILatexiseable
LaTeX- MathJax ( ).
. , ? , . ([ThreadStatic]
), .
- , Solve
Simplify
, .
, . , , . ,
using var _ = MaxExpansionTermCount.Set(10);
// -
(, Set
, IDisposable
).
. , . , . , .
- , ( ).