function calculate_force( left_pos, middle_pos, right_pos, K, alpha = 0.0, beta = 0.0, ) linear_force = K * (left_pos + right_pos - 2 * middle_pos) quadratic_force = alpha * (left_pos - middle_pos)^2 + alpha * (right_pos - middle_pos)^2 cubic_force = beta * (left_pos - middle_pos)^3 + beta * (right_pos - middle_pos)^3 return linear_force + quadratic_force + cubic_force end function tendency!(du, u, params, t) # unpack the params N, modes, beta, A, dt, num_steps = params # get the positions and momenta qs = u[1:2:end] ps = u[2:2:end] num_masses = length(qs) # go over the points in the lattice and update the state for i in 2:num_masses-1 # left_index = max(1, i - 1) # right_index = min(N, i + 1) du[i*2-1] = ps[i] force = calculate_force(qs[i-1], qs[i], qs[i+1], 1, 0, beta) du[i*2] = force end # make last point same as first at rest du[num_masses*2-1] = du[1] = 0 # set to 0 du[num_masses*2] = du[2] = 0 # if ps[Int(N / 2)] / M >= 1 # println("(in sim!) Time: ", t, " Vel: ", ps[Int(N / 2)] / M) # # println("Other Positions: ", qs) # println("Other Velocities: ", ps, "\n") # end end function get_initial_state( N, modes, beta, A, ) state = zeros(N + 2) amp = A * sqrt(2 / (N + 1)) for i in 2:N+1 state[i] = amp * sin((modes * π * (i - 1)) / (N + 1)) end return state end using DifferentialEquations function run_simulation( N, modes, beta, A, dt, num_steps, ) println("Running simulation with params: N=$N, modes=$modes, beta=$beta, A=$A, dt=$dt, num_steps=$num_steps") # states = [] state = get_initial_state(N, 1, beta, A) # prev_state = zeros(N) # for i in 1:N # prev_state[i] = state[i] # end params = (N, modes, beta, A, dt, num_steps) # dynamics!(state, prev_state, params, states) # state above is position, need to add in momentum s_0 = zeros(2 * (N + 2)) for i in 1:length(state) s_0[i*2-1] = state[i] end final_time = num_steps * dt t_span = (0.0, final_time) prob = ODEProblem(tendency!, s_0, t_span, params) sol = solve(prob, Tsit5(), reltol = 1e-8, abstol = 1e-8, maxiters = 1e10) # control simulation return sol end function get_pos_from_state(state) return state[1:2:end] end # Run the simulation # N = 32 # number of masses # beta = 2.3 # cubic string spring # A = 10 # amplitude # modes = 3 # number of modes to plot # final_time = 100000 # seconds # dt = 0.05 # seconds # num_steps = Int(final_time / dt) # params = (N, modes, beta, A, dt, num_steps) # println("Running simulation with params: ", params) # sol = run_simulation(N, modes, beta, A, dt, num_steps) # states = sol.u # timesteps = sol.t # println("Final state: ", states[end]) # plot the inital positions and the final positions using Plots # init_pos = get_initial_state(N, 1, beta, A) # final_pos = get_pos_from_state(states[end]) # println("Initial: ", init_pos) # println("Final: ", final_pos) # plot(init_pos, label = "Initial", marker = :circle, xlabel = "Mass Number", ylabel = "Displacement", title = "First Three Modes") # plot!(final_pos, label = "Final", marker = :circle) # println("Saving initial-final-beta15.png") # savefig("t/initial-final-beta-$beta.png") function animate_states(states, timesteps, from = 1, to = 1000) println("\nAnimating states") # animate the s array of positions # find the timestep that maps to the state index i_start = 1 i_end = length(timesteps) for i in 1:length(timesteps) if timesteps[i] <= from i_start = i continue end if timesteps[i] >= to i_end = i break end end anim = @animate for i in i_start:i_end s = get_pos_from_state(states[i]) t = timesteps[i] plot(s, label = "t = $t", marker = :circle, xlabel = "Mass Number", ylabel = "Displacement", ylim = (-3, 3)) end mp4(anim, "t/animated-fpu.mp4", fps = 30) println("Done animating, wrote to animated-fpu.mp4\n") end # animate_states(states, timesteps, 149500, 150000) function caluclate_energies_for_mode(states, mode) N = length(states[1]) / 2 - 2 total = [] kinetic = [] potential = [] for i in 1:length(states) total_energy = 0 kinetic_energy = 0 potential_energy = 0 # find a_k for this mode poses = get_pos_from_state(states[i]) a_k = 0 for j in 1:length(poses) a_k += poses[j] * sin((mode * (j - 1) * π) / (N + 1)) end amp = sqrt(2 / (N + 1)) a_k *= amp # get the potenital energy omega_k = 2 * sin((mode * π) / (2 * (N + 1))) p = 0.5 * omega_k^2 * a_k^2 # find the kinetic energy v_k = 0 vels = states[i][2:2:end] for j in 1:length(vels) v_k += vels[j] * sin((mode * (j - 1) * π) / (N + 1)) end v_k *= amp k = 0.5 * v_k^2 total_energy += k + p kinetic_energy += k potential_energy += p push!(total, total_energy) push!(kinetic, kinetic_energy) push!(potential, potential_energy) end return total, kinetic, potential end function calculate_total_energy_by_state(states, timesteps) total = [] kinetic = [] potential = [] for i in 1:length(states) vels = states[i][2:2:end] k = 0.5 * sum(vels .^ 2) poses = get_pos_from_state(states[i]) p = 0 for j in 2:length(poses) p += beta * (poses[j] - poses[j-1])^2 end push!(total, k + p) push!(kinetic, k) push!(potential, p) end # plot all three over time on the same plot plot(timesteps, total, label = "Total Energy", xlabel = "Time", ylabel = "Energy", title = "Total Energy Over Time") plot!(timesteps, kinetic, label = "Kinetic Energy") plot!(timesteps, potential, label = "Potential Energy") return total, kinetic, potential end function print_energies_for_modes(states, max_mode = 3, index = 1) # get the sum of total energy over all mode total = 0 kinetic = 0 potential = 0 for i in 1:max_mode t, k, p = caluclate_energies_for_mode(states, i) total += t[index] kinetic += k[index] potential += p[index] end println("Total Energy: ", total) println("Kinetic Energy: ", kinetic) println("Potential Energy: ", potential) end function plot_phase_space(states, mass_number, intersecting_mass = 4) # get the positions and momenta qs = [] ps = [] for i in 2:length(states) # only store if the other mass is crossing 0 if (states[i-1][intersecting_mass*2-1] < 0 && states[i][intersecting_mass*2-1] > 0) || (states[i-1][intersecting_mass*2-1] > 0 && states[i][intersecting_mass*2-1] < 0) s = states[i] q = s[mass_number*2-1] p = s[mass_number*2] push!(qs, q) push!(ps, p) end end s = scatter( qs, ps, label = "Mass $mass_number", xlabel = "Displacement", ylabel = "Momentum", title = "Phase Space for Masses when Mass $intersecting_mass crosses 0", legend = :topleft, marker = :circle, markersize = 2, xlim = (-1.5, 1.5), ylim = (-1.5, 1.5), ) # savefig(s, "t/phase-space-mass$mass_number-beta15.png") return s end function analyze_energies_of_n_modes(modes::Array{Int}, states, timesteps, beta) println("Analyzing energies of modes: ", modes) total_by_mode = Dict() kinetic_by_mode = Dict() potential_by_mode = Dict() for j in modes t, k, p = caluclate_energies_for_mode(states, j) total_by_mode[j] = t kinetic_by_mode[j] = k potential_by_mode[j] = p end total_energy = [] kinetic_energy = [] potential_energy = [] for i in 1:length(states) total = 0 kinetic = 0 potential = 0 for j in modes total += total_by_mode[j][i] kinetic += kinetic_by_mode[j][i] potential += potential_by_mode[j][i] end push!(total_energy, total) push!(kinetic_energy, kinetic) push!(potential_energy, potential) end # plot all three over time on the same plot plot(timesteps, total_energy, label = "Total Energy", xlabel = "Time", ylabel = "Energy", title = "Total Energy Over Time") plot!(timesteps, kinetic_energy, label = "Kinetic Energy") plot!(timesteps, potential_energy, label = "Potential Energy") savefig("t/procs/energies-modes-sum-beta-$beta.png") println("Saved energies-modes-sum-beta-$beta.png. Summary Below:\n") # plot the energies for each mode over time plt = plot(title = "Energy Over Time for Modes $(join(modes, ", "))", xlabel = "Time", ylabel = "Energy") for mode in modes plot!(plt, timesteps, total_by_mode[mode], label = "Mode $mode") # plot!(plt, timesteps, kinetic_by_mode[mode], label = "Mode $mode Kinetic") # plot!(plt, timesteps, potential_by_mode[mode], label = "Mode $mode Potential") end savefig(plt, "t/procs/energies-modes-separate-beta-$beta.png") # print the energies println("Total Energy Initial: ", total_energy[1]) println("Total Energy Final: ", total_energy[end]) println("Kinetic Energy Initial: ", kinetic_energy[1]) println("Kinetic Energy Final: ", kinetic_energy[end]) println("Potential Energy Initial: ", potential_energy[1]) println("Potential Energy Final: ", potential_energy[end], "\n") println("Done analyzing energies of modes: ", modes, "\n") return total_energy, kinetic_energy, potential_energy, total_by_mode, kinetic_by_mode, potential_by_mode end function animate_masses_phase_space(states, mass_numbers, intersecting_mass = 4) println("\nAnimating phase space for mass $mass_numbers when mass $intersecting_mass crosses 0") # animate the s array of positions # find the timestep that maps to the state index anim = @animate for i in mass_numbers s = plot_phase_space(states, i, intersecting_mass) s end mp4(anim, "t/animated-phase-space-masses-beta-$beta.mp4", fps = 24) end function plot_mode_phase_space(states, mode_num, intersecting_mode, beta) println("\nPlotting phase space for mode $mode_num") # convert the state to a mode a_modes = [] vel_modes = [] a_inter_modes = [] vel_inter_modes = [] N = length(states[1]) / 2 - 2 for i in 1:length(states) a_mode = 0 vel_mode = 0 a_inter_mode = 0 vel_inter_mode = 0 positions = states[i][1:2:end] velocities = states[i][2:2:end] for j in 2:length(positions)-1 a_mode += positions[j] * sin((mode_num * (j - 1) * π) / (N + 1)) vel_mode += velocities[j] * sin((mode_num * (j - 1) * π) / (N + 1)) a_inter_mode += positions[j] * sin((intersecting_mode * (j - 1) * π) / (N + 1)) vel_inter_mode += velocities[j] * sin((intersecting_mode * (j - 1) * π) / (N + 1)) end amp = sqrt(2 / (N + 1)) a_mode *= amp vel_mode *= amp a_inter_mode *= amp vel_inter_mode *= amp if i == 1 push!(a_inter_modes, a_inter_mode) push!(vel_inter_modes, vel_inter_mode) continue end if ((a_inter_modes[end] < 0 && a_inter_mode > 0) || (a_inter_modes[end] > 0 && a_inter_mode < 0)) push!(a_modes, a_mode) push!(vel_modes, vel_mode) end push!(a_inter_modes, a_inter_mode) push!(vel_inter_modes, vel_inter_mode) end # plot the phase space scatter(a_modes, vel_modes, label = "Beta = $beta", xlabel = "Displacement", ylabel = "Momentum", title = "Phase Space for Mode $mode_num when a_$intersecting_mode crosses 0", xlim = (-10, 10), ylim = (-1, 1), color = :red, legend = :topright, ) # savefig("t/frames/phase-space-mode-$mode_num-beta-$beta.png") println("Saved phase-space-mode-$mode_num-beta-$beta.png") end function animate_phase_space_plots_over_beta(betas, t_max, desired_mode, intersecting_mode) N = 32 # number of masses A = 10 # amplitude modes = 3 # number of modes to plot final_time = t_max # seconds dt = 0.05 # seconds num_steps = Int(final_time / dt) results = [] for b in betas s = run_simulation(N, modes, b, A, dt, num_steps) states = s.u timesteps = s.t push!(results, states) println("Simualted beta: ", b, " to t=", timesteps[end]) end anim = @animate for i in 1:length(betas) plot_mode_phase_space(results[i], desired_mode, intersecting_mode, betas[i]) end mp4(anim, "t/animated-phase-space-modes-over-beta.mp4", fps = 15) end # animate_phase_space_plots_over_beta(collect(0:0.025:4), 25000, 1, 3) # analyze_energies_of_n_modes([1, 3, 5, 7, 9, 11], timesteps) # animate_masses_phase_space(states, collect(2:N+1), 17) # plot_mode_phase_space(states, 1, 3) function estimate_lynapov_exponent(t_max, beta, jitter = 0.001) println("Estimating Lynapov Exponent for beta: ", beta) N = 32 # number of masses A = 10 # amplitude modes = 3 # number of modes to plot println("t_msx: ", t_max) final_time = t_max # seconds dt = 0.05 # seconds num_steps = Int(final_time / dt) t_span = (0.0, final_time) params = (N, modes, beta, A, dt, num_steps) # run a simulation with normal parameters is = get_initial_state(N, 1, beta, A) # plot iniital state plot(is, label = "Initial State", marker = :circle, xlabel = "Mass Number", ylabel = "Displacement", title = "Initial Positions of Masses", markersize = 4) is_0 = zeros(2 * (N + 2)) for i in 1:length(is) is_0[i*2-1] = is[i] end prob_s = ODEProblem(tendency!, is_0, t_span, params) # solve so that the timestep is exactly set to dt s = solve(prob_s, SSPRK33(), dt = dt) states_control = s.u timesteps = s.t # run a simulation with a small perturbation # dynamics!(state, prev_state, params, states) # state above is position, need to add in momentum is2 = get_initial_state(N, 1, beta, A) .* (1 - jitter) # perturb the initial state # is2 = get_initial_state(N, 1, beta, A) .- jitter # perturb the initial state plot!(is2, label = "Perturbed Initial State", marker = :cross, xlabel = "Mass Number", ylabel = "Displacement", title = "Perturbed Initial Positions of Masses", msw = 2) savefig("t/new/inits-jitter.png") s_0 = zeros(2 * (N + 2)) for i in 1:length(is2) s_0[i*2-1] = is2[i] end # add random jitter to the initial state # middle_index = Int(N / 2) * 2 # s_0[middle_index] -= jitter # subtract a little from momenetum of middle particle final_time = num_steps * dt t_span = (0.0, final_time) prob = ODEProblem(tendency!, s_0, t_span, params) sol = solve(prob, SSPRK33(), dt = dt) # perturbed simulation state_perturbed = sol.u time_perturbed = sol.t # println(time_perturbed .- timesteps, "\n") println("Finished simulations") println("Control len: ", length(states_control), " Perturbed len: ", length(state_perturbed), " Time len: ", length(time_perturbed)) # # print the difference in the two initial states # println("Initial State Difference (pertrubed - control): ", state_perturbed[1] .- states_control[1]) # println("Final State Difference (pertrubed - control): ", state_perturbed[end] .- states_control[end]) # plot the difference in the two states over time differences = [] for i in 1:length(state_perturbed) # calculate mode 1 difference a_k = 0 amp = sqrt(2 / (N + 1)) for j in 1:N diff = abs(state_perturbed[i][j*2-1] - states_control[i][j*2-1]) a_k += diff * sin((1 * (j - 1) * π) / (N + 1)) end a_k *= amp push!(differences, a_k) end plot(time_perturbed, differences, label = "Difference in States", xlabel = "Time", ylabel = "Difference", title = "Absolute Difference in States Over Time", lw = 1.5, color = :blue) savefig("t/frames/difference-in-states-beta-$beta.png") # perform a linear regression on the log of the differences # cut the data set into everythign after t=500 # find the index where t = 500 # index = 1 # for i in 1:length(time_perturbed) # if time_perturbed[i] >= 500 # index = i # break # end # end # differences = differences[index:end] # time_perturbed = time_perturbed[index:end] ln_differeces = log.(differences) (a, b) = linear_regression(time_perturbed, ln_differeces) a = round(a, digits = 4) b = round(b, digits = 4) plot(time_perturbed, differences, label = "ln(difference in mode1)", xlabel = "Time", ylabel = "Difference", title = "Absolute Difference in States Over Time", msw = 0.0, yscale = :ln, color = :blue, lw = 1.5) plot!(time_perturbed, exp.(a * time_perturbed .+ b), label = "exp($a*t + $b)", lw = 2, color = :red, linestyle = :dash) savefig("t/frames/difference-in-states-beta-$beta-log.png") println("Saved difference-in-states-beta-$beta.png and difference-in-states-beta-$beta-log.png\n") println("Lynapov Exponent: ", a) # check that solve doesn't explode # animate_states(state_perturbed, time_perturbed, 0, 1) return a end # linear regression of the log of the difference function linear_regression(x, y) n = length(x) x̄ = sum(x) / n ȳ = sum(y) / n a = sum((x .- x̄) .* (y .- ȳ)) / sum((x .- x̄) .^ 2) b = ȳ - a * x̄ return (a, b) end function analyze_equiparition(t_max, beta) # run a simulation with normal parameters N = 32 # number of masses A = 10 # amplitude modes = 3 # number of modes to plot final_time = t_max # seconds dt = 0.05 # seconds num_steps = Int(final_time / dt) t_span = (0.0, final_time) params = (N, modes, beta, A, dt, num_steps) s = run_simulation(N, modes, beta, A, dt, num_steps) states = s.u timesteps = s.t analyze_energies_of_n_modes([1, 3, 5, 7], states, timesteps, beta) end # my_beta = 0.3 # estimate_lynapov_exponent(10000, my_beta, 0.001) # analyze_equiparition(10000, my_beta) # function plot_betas_versus_lynapov_exponent(betas, t_max, jitter = 0.001) # lynapovs = [] # for b in betas # lynapov = estimate_lynapov_exponent(t_max, b, jitter) # push!(lynapovs, lynapov) # end # plot(betas, lynapovs, label = "Lynapov Exponent", xlabel = "Beta", ylabel = "Lynapov Exponent", title = "Lynapov Exponent Over Beta") # savefig("t/lynapov-over-beta.png") # end function plot_probability_distrubtion_of_mode(energy_of_mode, total_energy, timesteps, beta) # get the probability distribution of the mode prob = [] for i in 1:length(timesteps) push!(prob, energy_of_mode[i] / total_energy[1]) # energy is conserved end plot(timesteps, prob, label = "Probability of Mode 1", xlabel = "Time", ylabel = "Probability", title = "Probability of Mode 1 Over Time with beta=$beta", ylim = (0, 1)) savefig("t/probability-mode1-beta-$beta.png") end function analyze_probability_distribution_of_mode(t_max, beta) # run a simulation with normal parameters N = 32 # number of masses A = 10 # amplitude modes = 3 # number of modes to plot final_time = t_max # seconds dt = 0.05 # seconds num_steps = Int(final_time / dt) t_span = (0.0, final_time) params = (N, modes, beta, A, dt, num_steps) s = run_simulation(N, modes, beta, A, dt, num_steps) states = s.u timesteps = s.t # get the energies of the mode total_energy, kinetic_energy, potential_energy, total_by_mode, kinetic_by_mode, potential_by_mode = analyze_energies_of_n_modes([1, 3, 5, 7, 9, 11, 13], states, timesteps, beta) # get the probability distribution of the mode # plot_probability_distrubtion_of_mode(total_by_mode[1], total_energy, timesteps, beta) # print the time when the probability gets lower than .5 for i in 1:length(timesteps) if (total_by_mode[1][i] / total_energy[1]) < 0.6 println("TIME when probability of mode 1 is less than 0.6 for beta=$beta: ", timesteps[i]) return timesteps[i] end end return -1 end # estimate_lynapov_exponent(1000, 0.3, 0.001) function plot_pos_at_time_t(t, beta) # run a simulation with normal parameters N = 32 # number of masses A = 10 # amplitude modes = 3 # number of modes to plot final_time = t # seconds dt = 0.05 # seconds num_steps = Int(final_time / dt) t_span = (0.0, final_time) params = (N, modes, beta, A, dt, num_steps) s = run_simulation(N, modes, beta, A, dt, num_steps) states = s.u timesteps = s.t positions = s.u[end][1:2:end] inital_positions = s.u[1][1:2:end] plot(positions, label = "Positions at t=$t", xlabel = "Mass Number", ylabel = "Displacement", title = "Positions of Masses at t=$t, beta=$beta", lw = 2, marker = :circle) plot!(inital_positions, label = "Initial Positions", lw = 2, marker = :circle) savefig("t/new/positions-at-t-$t-beta-$beta.png") end function get_breakdown_time(beta, t_find = 3600) t = analyze_probability_distribution_of_mode(t_find, beta) if t == -1 println("Could not find time for beta: ", beta) return -1 end return t end # plot_pos_at_time_t(1000, 10) # plot_pos_at_time_t(1000, 0) # plot_betas_versus_lynapov_exponent(collect(0:1:50), 1000, 0.001) # analyze_probability_distribution_of_mode(100000, 2.0) # break_down_times = [] # bs = collect(1:0.5:50) # for b_s in bs # t_find = 3600 # t = analyze_probability_distribution_of_mode(t_find, b_s) # if t == -1 # println("Could not find time for beta: ", b_s) # continue # end # push!(break_down_times, t) # end # # plot beta vs breakdown time # plot(bs, break_down_times, label = "Breakdown Time", xlabel = "Beta", ylabel = "Time", title = "Breakdown Time Over Beta") # savefig("t/breakdown-time-over-beta.png") # # plot the log of this # one_over_breakdown_time = break_down_times .^ (-1) # (a, b) = linear_regression(bs, one_over_breakdown_time) # a = round(a, digits = 4) # b = round(b, digits = 4) # plot(bs, one_over_breakdown_time, label = "1 / (breakdown time)", xlabel = "Beta", ylabel = "1 / (breakdown time)", title = "Breakdown Time ^ -1 Over Beta", msw = 0.0, color = :blue, lw = 1.5) # plot!(bs, a * bs .+ b, label = "1 / t = $a * beta + $b", lw = 2, color = :red, linestyle = :dash) # savefig("t/ln-breakdown-time-over-beta.png") # println("Done!") # # for a range of betas, find the breakdown time and the lynapov exponent function tmp(betas) break_down_times = [] lynapovs = [] t_find = 350000 for b in betas # if b < 0.5 # t_find = 10000 # end t = get_breakdown_time(b, t_find) if t == -1 continue end t_find = round(Int, t) + 100 l = estimate_lynapov_exponent(t_find, b, 0.001) if l == 0 println("Lynapov for beta was zero: ", b) continue end push!(break_down_times, t) push!(lynapovs, l) end # plot lynapov vs breakdown time scatter(break_down_times, lynapovs, label = "Lynapov Exponent", xlabel = "Breakdown Time", ylabel = "Lynapov Exponent", title = "Lynapov Exponent Over Breakdown Time") savefig("t/new/new-lynapov-over-breakdown-time.png") # plot this over log of lynapovs ln_lynapovs = log.(lynapovs) ln_break_down_times = log.(break_down_times) (a, b) = linear_regression(ln_break_down_times, ln_lynapovs) a = round(a, digits = 4) b = round(b, digits = 4) scatter(ln_break_down_times, ln_lynapovs, label = "ln(Lynapov Exponent)", xlabel = "ln(Breakdown Time)", ylabel = "ln(Lynapov Exponent)", title = "ln(Lynapov Exponent) Over ln(Breakdown Time)", msw = 0.0, color = :blue, lw = 1.5) plot!(ln_break_down_times, a * ln_break_down_times .+ b, label = "ln(beta) = $a * ln(t) + $b", lw = 2, color = :red, linestyle = :dash) savefig("t/new/new-ln-lynapov-over-breakdown-time.png") # only one log (a, b) = linear_regression(lynapovs, ln_break_down_times) a = round(a, digits = 4) b = round(b, digits = 4) scatter(lynapovs, ln_break_down_times, label = "ln(Breakdown Time)", xlabel = "Lynapov Exponent", ylabel = "ln(Breakdown Time)", title = "ln(Breakdown Time) Over Lynapov Exponent", msw = 0.0, color = :blue, lw = 1.5) plot!(lynapovs, a * lynapovs .+ b, label = "ln(t) = $a * beta + $b", lw = 2, color = :red, linestyle = :dash) savefig("t/new/new-new-ln-breakdown-time-over-lynapov.png") # plot the lynapoovs to the ^-1 one_over_breakdown_time = break_down_times .^ (-1) (a, b) = linear_regression(lynapovs, one_over_breakdown_time) a = round(a, digits = 4) b = round(b, digits = 4) scatter(lynapovs, one_over_breakdown_time, label = "1 / (breakdown time)", xlabel = "Lynapov Exponent", ylabel = "1 / (breakdown time)", title = "1 / (breakdown time) Over Lynapov Exponent", msw = 0.0, color = :blue, lw = 1.5) plot!(lynapovs, a * lynapovs .+ b, label = "1 / t = $a * beta + $b", lw = 2, color = :red, linestyle = :dash) savefig("t/new/new-one-over-lynapov-over-breakdown-time.png") # plot the lynapov over betas scatter(betas, lynapovs, label = "Lynapov Exponent", xlabel = "Beta", ylabel = "Lynapov Exponent", title = "Lynapov Exponent Over Beta") savefig("t/new/new-lynapov-over-beta.png") end tmp(collect(0.3:0.025:10)) # estimate_lynapov_exponent(500000, 0.3, 0.001)