Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Path: blob/master/notebooks/chap09.ipynb
Views: 531
Modeling and Simulation in Python
Chapter 9
Copyright 2017 Allen Downey
The following displays SymPy expressions and provides the option of showing results in LaTeX format.
Analysis with SymPy
Create a symbol for time.
If you combine symbols and numbers, you get symbolic expressions.
The result is an Add
object, which just represents the sum without trying to compute it.
subs
can be used to replace a symbol with a number, which allows the addition to proceed.
f
is a special class of symbol that represents a function.
The type of f
is UndefinedFunction
SymPy understands that f(t)
means f
evaluated at t
, but it doesn't try to evaluate it yet.
diff
returns a Derivative
object that represents the time derivative of f
We need a symbol for alpha
Now we can write the differential equation for proportional growth.
And use dsolve
to solve it. The result is the general solution.
We can tell it's a general solution because it contains an unspecified constant, C1
.
In this example, finding the particular solution is easy: we just replace C1
with p_0
In the next example, we have to work a little harder to find the particular solution.
Solving the quadratic growth equation
We'll use the (r, K) parameterization, so we'll need two more symbols:
Now we can write the differential equation.
And solve it.
The result, solution_eq
, contains rhs
, which is the right-hand side of the solution.
We can evaluate the right-hand side at
Now we want to find the value of C1
that makes f(0) = p_0
.
So we'll create the equation at_0 = p_0
and solve for C1
. Because this is just an algebraic identity, not a differential equation, we use solve
, not dsolve
.
The result from solve
is a list of solutions. In this case, we have reason to expect only one solution, but we still get a list, so we have to use the bracket operator, [0]
, to select the first one.
Now in the general solution, we want to replace C1
with the value of C1
we just figured out.
The result is complicated, but SymPy provides a method that tries to simplify it.
Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.
Just to double-check, we can evaluate it at t=0
and confirm that we get p_0
This solution is called the logistic function.
In some places you'll see it written in a different form:
where .
We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:
To see whether two expressions are equivalent, we can check whether their difference simplifies to 0.
This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).
But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general.
Exercises
Exercise: Solve the quadratic growth equation using the alternative parameterization
Exercise: Use WolframAlpha to solve the quadratic growth model, using either or both forms of parameterization:
or
Find the general solution and also the particular solution where f(0) = p_0
.