首页 > 解决方案 > 如何使用 oop 将方法的数据传递给其他人,例如使用 python 中的数值方法

问题描述

出现这个错误,ValueError: setting an array element with a sequence。我没有 oop 就做到了,而且做得很好。我需要 def loop(self): 的数据将其传递给 def f(self, x, y): 并保持安全

class rungekuta():

   def __init__(self):

      self.x = np.linspace(1, 5, 50)
      self.y = np.zeros(len(self.x))
      self.y[0] = 4
      self.loop()
      self.f()

  def f(self, x, y):

      return (self.x*np.sqrt(self.y))

  def loop(self):
      h = 0.2
      for i in range(len(self.x) - 1):
          k1 = self.f(self.x[i], self.y[i])
          k2 = self.f(self.x[i] + h / 2, self.y[i] + k1 * (h / 2))
          k3 = self.f(self.x[i] + h / 2, self.y[i] + k2 * (h / 2))
          k4 = self.f(self.x[i] + h, self.y[i] + k3 * h)
          self.y[i+1] = self.y[i]+(h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)

  def draw(self):
     plt.plot(self.x, self.y)
     plt.show()

run = rungekuta()
run.draw()

这是没有opp python的算法

 def f(x,y):

    return (x*np.sqrt(y))

 def rk4(f,a,b,y0,h):

    x=np.arange(a,b,h)
    n=len(x)
    k1=np.zeros(len(x))
    k2=np.zeros(len(x))
    k3=np.zeros(len(x))
    k4=np.zeros(len(x))
    y=np.zeros(len(x))
    y[0]=y0
    for i in range(0,len(x)-1):
    
        k1[i]=f(x[i],y[i])
        k2[i]=f(x[i]+h/2,y[i]+k1[i]*(h/2))
        k3[i]=f(x[i]+h/2,y[i]+k2[i]*(h/2))
        k4[i]=f(x[i]+h,y[i]+k3[i]*h)
        y[i+1]=y[i]+(h/6)*(k1[i]+2*k2[i]+2*k3[i]+k4[i])
    plt.plot(x,y)
    plt.show()
rk4(f,1,5,4,0.2)

标签: pythonarraysnumpyoopnumerical-methods

解决方案


所有问题都是f()课堂上的方法。它得到了xy它应该使用x, y,而不是self.x, self.y

你应该self.f()__init__

import numpy as np
import matplotlib.pyplot as plt

class Rungekuta():  # PEP8: `CamerCaseNames` for classes

  def __init__(self):

      self.x = np.linspace(1, 5, 50)
      self.y = np.zeros(len(self.x))
      self.y[0] = 4
      self.loop()

  def f(self, x, y):
      return (x * np.sqrt(y))

  def loop(self):
      h = 0.2
      for i in range(len(self.x) - 1):
          k1 = self.f(self.x[i], self.y[i])
          k2 = self.f(self.x[i] + h / 2, self.y[i] + k1 * (h / 2))
          k3 = self.f(self.x[i] + h / 2, self.y[i] + k2 * (h / 2))
          k4 = self.f(self.x[i] + h, self.y[i] + k3 * h)
          self.y[i+1] = self.y[i]+(h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)

  def draw(self):
     plt.plot(self.x, self.y)
     plt.show()

run = Rungekuta()
run.draw()

PEP 8 --- Python 代码风格指南


推荐阅读