You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复种群模型绘图中的Python运算类型不支持错误?

解决指数/Logistic种群模型代码的错误问题

首先来拆解你遇到的错误:

unsupported operand type(s) for ** or pow(): 'builtin_function_or_method' and 'float'
这个错误是因为你把math.exp当成了一个数值来做幂运算(**),但实际上math.exp是一个内置函数,用来计算自然指数e^x,正确的调用方式是math.exp(你的参数),而不是math.exp ** 参数。

接下来我们一步步修正你的代码,同时解决其他潜在问题:

主要错误修正点

  1. 修复math.exp的调用方式
    把math.exp ** (r * t)改成math.exp(r * t),这是直接触发错误的根源。

  2. 定义缺失的变量u
    你的代码里用到了u但没有定义,这里我们可以用方向场的向量归一化逻辑来处理:对于指数模型P’(t) = rP,方向场的每个点(t, P)对应的向量是(1, r*P),我们基于这个来计算归一化后的向量分量。

  3. 避免覆盖用户输入的参数
    你先让用户输入了t和P,但后面立刻用t = x、P = y覆盖了这些值,这会丢失用户输入的初始条件,建议把网格变量改成其他名字,比如t_grid和P_grid。

修正后的指数模型(A分支)代码

import numpy as np
import matplotlib.pyplot as plt
import math
from IPython.display import clear_output

print("Utilize Which Growth Model of Population? (Type A or B)")
print()
print("A Exponential Growth Model")
print("B Logistic Growth Model")
print()
C = input("Growth Model of choice : ")
print()

if C == "A":
    # Definition of Parameters
    print("The Differential Equation of your chosen growth model is P'(t) = r*P(t)")
    print()
    print("Where r = growth parameter")
    print("Where P(t) = total population at a certain time t")
    print("Where t = time")
    print()
    # Explanation of Differential Equation
    print("This equation can be considered as the exponential differential equation")
    print("because its solution is P(t) = P(0)*e^(r*t) ; where P(0) = Initial Population")
    print()
    print("This equation can be portrayed by using this graph : ")
    
    # 修正:用不同的名字存储网格,避免覆盖用户输入
    t_grid, P_grid = np.meshgrid(np.linspace(0, 10, 10), np.linspace(0, 50, 10))
    r = float(input("Encode Growth Parameter :"))
    t_target = float(input("At how many years do you want to solve? :"))
    P0 = float(input("Encode Initial Population Count :"))
    
    # 计算方向场的向量:对于P'(t)=rP,向量是(1, r*P)
    U = np.ones_like(t_grid)  # t方向的分量为1
    V = r * P_grid            # P方向的分量为r*P
    
    # 归一化向量,让箭头大小一致
    norm = np.sqrt(U**2 + V**2)
    Un = U / norm
    Vn = V / norm
    
    plt.quiver(t_grid, P_grid, Un, Vn, color='gray')
    
    # 绘制用户输入初始条件对应的解曲线
    t_sol = np.linspace(0, t_target, 100)
    P_sol = P0 * np.exp(r * t_sol)  # 用np.exp更适配numpy数组
    plt.plot(t_sol, P_sol, color='red', label=f"P(t) = {P0}e^({r}t)")
    
    plt.xlabel('Time (t)')
    plt.ylabel('Population (P)')
    plt.title('Exponential Growth Model Direction Field')
    plt.legend()
    plt.show()

if C == "B":
    print("The Differential Equation of your chosen growth model is y' = k*y*(M-y)")
    print()
    print("Where k = growth rate parameter")
    print("Where y = population at specific time")
    print("Where M = carrying capacity (limit of population as t approaches infinity)")
    print()
    # 可以参考指数模型的逻辑补充方向场绘制代码
    print("You can add direction field plotting code here following the exponential model pattern!")

额外说明

  • 我把时间和种群数量的范围改成了非负区间,因为种群模型的时间和种群数不可能为负,更符合实际意义。
  • 补充了解曲线的绘制,让用户能直观看到输入初始条件后的种群变化趋势。
  • 对于Logistic模型(B分支),你可以参考指数模型的逻辑,基于微分方程y’=k*y*(M-y)计算方向场向量(1, k*y*(M-y)),再归一化绘制即可。

内容的提问来源于stack exchange,提问作者JTM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:08:28