Latest | 0.0.1 |
---|---|
Homepage | https://github.com/Sajjon/EquationKit |
License | Apache License, Version 2.0 |
Platforms | ios 10.0, osx 10.9, tvos 9.0, watchos 2.0 |
Write equations in pure Swift, differentiate and/or evaluate them.
let polynomial = (3*x + 5*y - 17) * (7*x - 9*y + 23)
print(polynomial) // 21x² + 8xy - 50x - 45y² + 268y - 391)
let number = polynomial.evaluate() {[ x <- 4, y <- 1 ]}
print(number) // 0
let y' = equation.differentiateWithRespectTo(x)
print(y') // 42x + 8y - 50
y'.evaluate() {[ x <- 1, y <- 1 ]} // 0
let x' = equation.differentiateWithRespectTo(y)
print(x') // 8x - 90y + 268
x'.evaluate() {[ x <- 11.5, y <- 4 ]} // 0
Generics
EquationKit is fully generic and supports any number type conforming to the protocol NumberExpressible
, Swift Foundation’s Int
and Double
both conforms to said protocol. By conforming to NumberExpressible
you can use EquationKit with e.g. excellent attaswift/BigInt. You need only to copy the code from BigInt+IntegerNumberExpressible
We would like to use operator overloading, making it possible to write x + y
, x - 2
, x*z² - y³
etc. Supporting operator overloading using generic func + <N: NumberExpressible>(lhs: Variable, rhs: N) -> PolynomialStruct<N>
results in Swift compiler taking too long time to compile polynomials having over 3 terms (using Xcode 10 beta 6 at least). Thus EquationKit does not come bundled with any operator support at all. Instead, you chose your Number type yourself. If you don’t need BigInt
then Double
is probably what you want. Just copy the file Double_Operators
into your project and you are good to go! It contains around 10 operators which are all 3 lines of code each.
If you need BigInt
support, just copy the file BigInt_Operators
instead.
Variables
You write powers using the custom operator x^^2
, but for powers between 2
and 9
you can use the unicode superscript symbols instead, like so:
let x = Variable("x")
let y = Variable("y")
let x² = Exponentiation(x, exponent: 2)
let x³ = Exponentiation(x, exponent: 3)
let x⁴ = Exponentiation(x, exponent: 4)
let x⁵ = Exponentiation(x, exponent: 5)
let x⁶ = Exponentiation(x, exponent: 6)
let x⁷ = Exponentiation(x, exponent: 7)
let x⁸ = Exponentiation(x, exponent: 8)
let x⁹ = Exponentiation(x, exponent: 9)
let y² = Exponentiation(y, exponent: 2)
You can copy the contents of the file Double_Variables
or for BigInt support: BigInt_Variables
and of course extended with more variables of your choice.
Supported
- Single and multivariate equations (no limitation to how many variables, go crazy!)
- Differentiate any single or multivariate equation with respect to some of its variables
- Multiply equations with equations
- Modulus
- BigInt support
Limitations
Not supported, but on roadmap
- Substitution
(3*(4*x + 5)^^2 - 2*(4x+5) - 1).substitute() { z <~ (4*x + 5) }
//3*z²-2*z-1
- Division
- Finding roots (solving)
Not supported and not on the roadmap
- Variables in exponents, such as
2^x
log
/ln
functions- Trigonometric functions (
sin
,cos
,tan
etc.) - Complex numbers
Latest podspec
{ "name": "EquationKit", "version": "0.0.1", "platforms": { "ios": "10.0", "osx": "10.9", "tvos": "9.0", "watchos": "2.0" }, "license": { "type": "Apache License, Version 2.0", "file": "LICENSE" }, "summary": "Differentiate and evaluate multivariate polynomials in pure Swift", "homepage": "https://github.com/Sajjon/EquationKit", "authors": "Alex Cyon", "source": { "git": "https://github.com/Sajjon/EquationKit.git", "tag": "0.0.1" }, "source_files": "Source/**/*.swift", "resources": "Support/**/*.swift", "social_media_url": "https://twitter.com/alexcyon" }
Thu, 30 Aug 2018 10:40:20 +0000