Skip to main content
 首页 » 编程设计

python之我在 spyder 上看到“"TypeError: ' 元组对象不支持项目分配”

2025年05月04日18Free-Thinker

这到底是什么意思?我不应该使用 for 循环吗?我需要另一个元组吗?

对于上下文:我正在尝试使用 Huen 的方法在 t=0,0.2,0.4,0.6 处求解步长 h=0.2 的 dydt=y/((t+1)**2)

#import libraries 
import numpy as np 
import matplotlib.pyplot as plt 
 
def dydt(t,y): 
    dfdt = y / ((t + 1) ** 2) 
    return dfdt 
 
def IVPsolver2(dydt_fun, y0, t0, t1, t2, tf, h): 
    n = 50 #points 
    h = (tf-t0)/(n-1) #step size 
    t = np.linspace(t0,t1,t2,tf,n) 
    y = np.zeros(n) #preallocate zeros 
    yp = np.zeros(n) 
    m = np.zeros(n) 
    mc = np.zeros(n) 
    yp[0] = y0 #first yp at y0 
    y[0] = y0 #y is 0 
    t[0] = 0 #t is 0 
    for i in range(0,n-1): 
        m[i] = dydt_fun(t[i-1],y[i-1]) #calculating slope 
        yp[i] = y[i] + m[i]*h #calculating predicted y at slope y 
        mc[i] = dydt_fun(t[i+1],yp[i]) #slope corrector, 2 step 
        t[i+1] = t[i] + h #t going by stepsize 
        y[i+1] = y[i] + ((m[i]+mc[i])/2)*h #corrected y 
    return t, y 
 
def main(): #plotting   
    x2, y2 = IVPsolver2(dydt, 1, 0, 0.2, 0.4, 0.6, 0.2) 
    plt.plot(x2,y2, 'o', mfc = 'purple') 
 
    return 
main() 

请您参考如下方法:

问题出在您的 np.linspace 语句上。这是 linspace 的文档.语法是:numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)。所以你只需要给出起点和终点,以及你想要的间隔数。所以在将你的程序改成这样之后:

import numpy as np 
import matplotlib.pyplot as plt 
 
def dydt(t,y): 
    dfdt = y / ((t + 1) ** 2) 
    return dfdt 
 
def IVPsolver2(dydt_fun, y0, t0, t1, t2, tf, h): 
    n = 50 #points 
    h = (tf-t0)/(n-1) #step size 
    t = np.linspace(t0,tf,n) # <----- see change here ----  
    y = np.zeros(n) #preallocate zeros 
    yp = np.zeros(n) 
    m = np.zeros(n) 
    mc = np.zeros(n) 
    yp[0] = y0 #first yp at y0 
    y[0] = y0 #y is 0 
    t[0] = 0 #t is 0 
    for i in range(0,n-1): 
        m[i] = dydt_fun(t[i-1],y[i-1]) #calculating slope 
        yp[i] = y[i] + m[i]*h #calculating predicted y at slope y 
        mc[i] = dydt_fun(t[i+1],yp[i]) #slope corrector, 2 step 
        t[i+1] = t[i] + h #t going by stepsize 
        y[i+1] = y[i] + ((m[i]+mc[i])/2)*h #corrected y 
    return t, y 
 
def main(): #plotting   
    x2, y2 = IVPsolver2(dydt, 1, 0, 0.2, 0.4, 0.6, 0.2) 
    plt.plot(x2,y2, 'o', mfc = 'purple') 
    plt.show() 
    return 
main() 

你的程序给出了这个:

您可以随心所欲地使用 linspace,以满足您的标准。