matplotlib - Phase Portrait of Coupled ODEs Not Matching Expected Graph in Python (SciPy) - Stack Overflow

I’m trying to generate a phase portrait for a system of coupled ordinary differential equations (ODEs)

I’m trying to generate a phase portrait for a system of coupled ordinary differential equations (ODEs) using Python’s scipy.integrate.solve_ivp. The system models the frequency of cooperators (x) and the multiplication of cooperators (r_c) in an evolutionary game theory context with a time-dependent environment w(t) .However, my output graph does not match the expected phase portrait, particularly in terms of convergence and the shape of the cyclic region.

Equations and Parameters

It's a coupled ode equation of the system

where : w(t) = 1 - 0.5 * sin ( a*t + delta)

parameters : N = 4 , r_d = 0.6 , epchilon = 6 , alpha = 1.5 , beta = 3.5 , theta = 0.1 , delta = - pie / 2

Expected Output Expected graph

Actual Output My output graph

Code

Here’s my complete code:

import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# Parameters
N = 4
rd = 0.6
epsilon = 6
alpha = 1.5
beta = 3.5
theta = 0.5
a = 0.1
delta = -np.pi / 2

# Time-dependent w2 function
def w2(t):
    return 1 - 0.5 * np.sin(a * t + delta)

# Define the system of ODEs
def coupled_system(t, state):
    x, rc = state
    w = w2(t)  # Time-dependent w2
    common_term1 = ((w * (w * x - x + 1) ** (N - 1)) - 1) / (N * (w - 1))
    common_term2 = (((w * x - x + 1) ** (N - 1)) - 1) / (N * (w - 1))

    dx_dt = x * (1 - x) * ((rc * common_term1) - 1 - (rd * common_term2))
    drc_dt = epsilon * (rc - alpha) * (beta - rc) * (-x * ((rc * common_term1) - 1) + rd * theta * (1 - x) * common_term2)

    return [dx_dt, drc_dt]

# Time span
t_span = (0, 50)
t_eval = np.linspace(*t_span, 1000)

# Increase initial conditions density
x0_vals = np.linspace(0.00, 1.00, 30)  # More starting points
rc0_vals = np.linspace(1.50, 3.50, 30)

# Store trajectories for different initial conditions
trajectories = []

for x0 in x0_vals:
    for rc0 in rc0_vals:
        sol = solve_ivp(coupled_system, t_span, [x0, rc0], t_eval=t_eval,rtol=1e-6,atol=1e-9)
        trajectories.append(sol)

# Plot trajectories with improved color coding and smoothing
plt.figure(figsize=(8, 6))

for sol in trajectories:
    x_traj, rc_traj = sol.y
    final_x, final_rc = x_traj[-1], rc_traj[-1]

    # Color classification based on the final state
    if final_x < 0.001:  # Extinct cooperators
        color = '#1034a6'
    elif final_x > 0.80 and abs(final_rc - alpha) < 0.3 :  # Full cooperation
        color = '#FF1493'  # Deep Pink
    else:  # Cyclic behavior
        color = 'orange'

    plt.plot(x_traj, rc_traj, color=color, linewidth=0.5)

plt.xlabel("Frequency of Cooperators, x")
plt.ylabel("Multiplication of Cooperators, r_c")
plt.title("Phase Portrait of the System")
plt.xlim([0.0, 1.0])
plt.ylim([1.5, 3.5])
plt.show()

Questions

Why is my phase portrait not matching the expected graph? Specifically:

1.Why do the pink trajectories converge to r_c = 2.0 - 2.5 instead of r_c = 1.5

2.Why is the cyclic region (orange trajectories) too elongated and not compact?

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744278252a4566439.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信