A new language is best learned through examples. In this section, we collected a number of examples of math scenarios using S2, so you have a better idea of what S2 is capable of. In the other sections of the course, you will learn S2 APIs and math concepts in depth. The S2 platform also allows us to develop data-driven solutions for scientific and business issues.

## Using S2 on S2 IDE

If you are using S2 on S2 IDE, please make sure to write the magical keyword %use s2 on a cell and execute the cell before running any line of code. When you have this magic keyword, the S2 IDE will recognize that you are using the S2.

				
// ALWAYS START THIS MAGICAL KEYWORD USING S2 or nothing will work
%use s2



## Using S2 for Linear Algebra

				
// define a vector
var v = DenseVector(arrayOf(1.1, -2.2, 3.3))
println(v)

// define a matrix
var A = DenseMatrix(arrayOf(
doubleArrayOf(1.0, 2.0, 3.0),
doubleArrayOf(4.0, 5.0, 6.0)))
println(A)

// B = Av
val B = A.multiply(v)
println(B)


OUTPUT: [1.100000, -2.200000, 3.300000]
2x3
[,1] [,2] [,3]
[1,] 1.000000, 2.000000, 3.000000,
[2,] 4.000000, 5.000000, 6.000000,
[6.600000, 13.200000]

## Using S2 for Calculus

				
// define a function f(x)
val f: UnivariateRealFunction = object : AbstractUnivariateRealFunction() {
override fun evaluate(x: Double): Double {
return x.pow(2) + 2*x + 1 // x^2 + 2x + 1
}
}

// find root for a function
val solver = NewtonRoot(1e-9, 10)
val root: Double = solver.solve(f, 0.5)
println(String.format("f(%f) = %f", root, f.evaluate(root)))


OUTPUT: f(-0.998535) = 0.000002
				
// plot a function
val p = JGnuplot(false)
p.plot()


OUTPUT:
				
// optimization
val solver = BrentMinimizer(1e-15, 20)
val soln = solver.solve(f)
val xmin: Double = soln.minimizer()
val fmin: Double = f.evaluate(xmin)
println(String.format("f(%f) = %f", xmin, fmin))


OUTPUT: f(0.000000) = 1.000000
				
// differentiate f w.r.t. x once
val df1: UnivariateRealFunction = FiniteDifference(f, 1, FiniteDifference.Type.CENTRAL) // 2x + 2
df1.evaluate(1.0)

// integration
val integrator: Integrator = Riemann()
val I: Double = integrator.integrate(df1, 0.0, 1.0) // ∫_[0,1] (2x + 2) dx = x^2 + 2x
I


OUTPUT: 3.000000000218579

## Using S2 for Statistics

				
// statistics
val gaussian = NormalRNG(0.0, 1.0) // a standard Gaussian random number generator
val numbers: MutableList = mutableListOf()
for (i in 1..10000) { // generate random numbers
val x: Double = gaussian.nextDouble()
}
val arr = numbers.toDoubleArray()
println(Mean(arr).value())
println(Variance(arr).standardDeviation())
println(Skewness(arr).value())
println(Kurtosis(arr).value())


OUTPUT: 0.007440710227587757
0.9934094869218749
-3.733142452297809E-4
-0.003197798050856182

## Using S2 to Process Large-scale Data

				
val aapl = s2.dataFrame("stock", "AAPL", "2020-01-01", "2020-11-01")
aapl


OUTPUT: A DataFrame: 211 x 10
ticker         date     open     high      low    close      volume   dividends   closeunadj
1     AAPL   2020-01-02    74.06    75.15   73.797   75.088   135647456           0       300.35
2     AAPL   2020-01-03   74.287   75.145   74.125   74.358   146535512           0       297.43
3     AAPL   2020-01-06   73.448    74.99   73.188    74.95   117288824           0        299.8
4     AAPL   2020-01-07    74.96   75.225    74.37   74.597   111510620           0       298.39
5     AAPL   2020-01-08    74.29    76.11   74.289   75.797   132363784           0       303.19
6     AAPL   2020-01-09   76.809   77.608    76.55   77.407   167082252           0       309.63
7     AAPL   2020-01-10    77.65   78.168   77.062   77.582   140869088           0       310.33
8     AAPL   2020-01-13    77.91   79.267   77.787    79.24   120114968           0       316.96
9     AAPL   2020-01-14   79.175   79.392   78.043    78.17   162613828           0       312.68
10     AAPL   2020-01-15   77.963   78.875   77.388   77.835   121923528           0       311.34
and 201 more rows, and and 1 more variables: