Python OOP继承场景下子类solv的self.Y数组无法填充数据问题
Python OOP继承场景下子类属性赋值问题修复
存在的问题
- 参数不匹配错误:
fun方法定义了2个必传位置参数,但在__init__中调用时没有传入参数,直接触发参数缺失报错 - 数组长度不匹配:初始化时
self.Y是与self.t等长的全零数组,后续调用np.append追加等长的计算结果后,self.Y长度为self.t的2倍,绘图时会触发维度不一致报错 - 冗余参数问题:
fun方法中定义的t、Y参数全程未被使用,实际逻辑调用的是父类初始化生成的实例属性self.t,参数属于无效定义
修复后完整代码
import numpy as np import matplotlib.pyplot as plt class System(): def __init__(self): h = 0.5 self.t = np.linspace(0, 20+h, int(20/h)) self.x = np.zeros(len(self.t)) self.x[0] = 5000 self.y = np.zeros(len(self.t)) self.y[0] = 0 self.loop() def dxdt(self, x, y, t): return -0.1*x def dydt(self, x, y, t): return -0.1*x-0.2*y def loop(self): h = 0.5 for i in range(len(self.t)-1): k1 = h*self.dxdt(self.x[i], self.y[i], self.t[i]) l1 = h*self.dydt(self.x[i], self.y[i], self.t[i]) k2 = h*self.dxdt(self.x[i]+k1*h/2, self.y[i]+l1*h/2, self.t[i]+h/2) l2 = h*self.dydt(self.x[i]+k1*h/2, self.y[i]+l1*h/2, self.t[i]+h/2) k3 = h*self.dxdt(self.x[i]+k2*h/2, self.y[i]+l2*h/2, self.t[i]+h/2) l3 = h*self.dydt(self.x[i]+k2*h/2, self.y[i]+l2*h/2, self.t[i]+h/2) k4 = h*self.dxdt(self.x[i]+k3*h, self.y[i]+l3*h, self.t[i]+h) l4 = h*self.dydt(self.x[i]+k3*h, self.y[i]+l3*h, self.t[i]+h) self.x[i+1] = self.x[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4) self.y[i+1] = self.y[i] + 1/6*(l1 + 2*l2 + 2*l3 + l4) class solv(System): def __init__(self): super(solv, self).__init__() self.fun() def fun(self): # 直接将计算结果赋值给self.Y,长度与self.t完全匹配 self.Y = 5000 - 0.5*self.t**2 def dibu(self): plt.plot(self.t, self.Y, color='black') plt.show() fn = solv() fn.dibu()
修复说明
移除了
fun方法的冗余参数,取消无意义的np.append操作,直接将计算得到的与self.t等长的数组赋值给self.Y,既符合将fun计算结果填充到self.Y的需求,也能正常完成绘图操作。
内容的提问来源于stack exchange,提问作者Fabian Zamora
相关产品推荐
相关产品推荐

