Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: Summer A ODEs
Views: 36
Visibility: Unlisted (only visible to those who know the link)
Image: ubuntu2004
Kernel: SageMath 9.2

Critical points of Non-linear systems

We have seen that the qualitative behavior autonomous systems x=F(x)\mathbf{x}' = F(\mathbf{x})

can usually be understood locally, and it splits into two cases:

  1. Near non-critical points, by continuity, nearby trajectories all point in roughly the same direction.

  2. Near (isolated, non-degenerate) critical-points we can analyze the local behavior by linearizing the problem, and studying the linear problem

x=J(xcrit)x\mathbf{x}' = J(\mathbf{x}_{crit}) \mathbf{x}

where xcrit\mathbf{x}_{crit} is the critical point and J(x)J(\mathbf{x}) is the Jacobian of FF at x\mathbf{x}. . We will investigate this technique and its limitations in describing global beaviour by analyzing Rossler system, the system of ODEs

x=yzy=x+ayz=b+z(xc)\begin{align*}x' &= -y-z\\ y' &= x+ ay\\ z' &= b + z(x - c)\end{align*}
import warnings warnings.filterwarnings("ignore", category=UserWarning) x,y,z=var('x,y,z') a0=0.2 # 10 b0= 0.2 #28 c0=5.7 @interact def rossler_plot(a = slider(0,3, default = a0,step_size = 0.05, label = '$a$'), b = slider(0,3, default = b0,step_size = 0.05, label = '$b$'), c = slider(0,3, default = c0,step_size = 0.1, label = '$c$'), tmax = slider(100,1000, default = 250,step_size = 10, label = 't_max'), ics = input_box(default = [1,1,1], label = "Initial condition"), auto_update = False): rossler=[-y-z,x + a*y,b + z*(x - c)] Jacobian = lambda x0,y0,z0: Matrix([[0,-1,-1],[1,a,0],[z0, 0, x0 - c]]) N=25000 h=tmax/N times=srange(0,tmax+h,h) sol=desolve_odeint(rossler,ics,times,[x,y,z],rtol=1e-13,atol=1e-14) crits_dict = solve([rhs == 0 for rhs in rossler], [x,y,z], solution_dict = True) crits = [(s[x].numerical_approx(digits = 2), s[y].numerical_approx(digits = 2), s[z].numerical_approx(digits = 2)) for s in crits_dict] show(line(sol) + sum(sphere(crit,0.2, color = 'red') for crit in crits)) for crit in crits: show("Critical point:") show(crit) Jf = Jacobian(crit[0], crit[1], crit[2]) show('J_f = ' + latex(Jf) ) evals = [a.numerical_approx(digits = 2) for a in Jf.eigenvalues()] show('eigenvalues = ' + latex(evals))

Try the following initial values to see some local behavior near critical points

  1. Initial condition [.015,0.07,3][.015, -0.07, 3] to see the local behaviour near the critial point that solutions tend to go towards

  2. Initial condition [0,12,7][0,12, 7] to see spiraling around the second critial point while it gets further away from that point exponentially, as consistent with the eigenvalues.

If we pick an initial condition too close to the second critical point, the computer has a hard time plotting the entire graph because of how unstable this point is, but you can infer the behavior from the second listed initial condition.