【问题标题】:how do i create a graph of multiple x,y points inside a loop?如何在循环内创建多个 x,y 点的图形?
【发布时间】:2021-09-07 14:07:54
【问题描述】:

所以我在堆栈上看到了 RK4 的这段代码,我发现它非常有用。但是,我无法找到在 x 的每个增量(h)处绘制每个 y 值的方法。

def f(x,y):
    return 2*x**2-4*x+y

def RK4(x0,y0):
    while x0 < b:
        k1 = h*f(x0,y0)
        k2 = h*f(x0+0.5*h,y0+0.5*k1)
        k3 = h*f(x0+0.5*h,y0+0.5*k2)
        k4 = h*f(x0+h,y0+k3)
        y0+=(k1+2*k2+2*k3+k4)/6
        x0+=h
    return y0

b=3
h=0.001
print(RK4(1,0.7182818))

【问题讨论】:

    标签: python function matplotlib seaborn runge-kutta


    【解决方案1】:

    您可以将列表中的每个点作为元组追加,然后对元组列表执行线图操作。您可以在下面的注释代码中找到它。

    import matplotlib.pyplot as plt
    
    
    def f(x, y):
        return 2 * x ** 2 - 4 * x + y
    
    
    def RK4(x0, y0):
        pts = []  # empty list
        while x0 < b:
            k1 = h * f(x0, y0)
            k2 = h * f(x0 + 0.5 * h, y0 + 0.5 * k1)
            k3 = h * f(x0 + 0.5 * h, y0 + 0.5 * k2)
            k4 = h * f(x0 + h, y0 + k3)
            y0 += (k1 + 2 * k2 + 2 * k3 + k4) / 6
            x0 += h
            pts.append((x0, y0))  # appending the tuple
        plt.plot(*zip(*pts))  # plotting the list of tuple
        plt.show()
        return y0
    
    
    b = 3
    h = 0.001
    print(RK4(1, 0.7182818))
    

    可以看到剧情如下

    【讨论】:

    • 谢谢。这非常有帮助
    【解决方案2】:

    从设计的角度来看,最好将 RK4 代码和绘图代码分开,数值求解器不应该关心其结果之后如何使用。

    那么接下来就是时间数组的构造了,可以传给RK4方法,也可以在里面构造返回,两者各有优势。如果速度是一个问题,则应以最终形式显式构造数组(请参阅example on math.SE),为方便起见,也可以增量构造它们。因此代码可以更改为

    def RK4(f,x0,y0,xb,dx):
        x, y = [x0],[y0]
        while x0 < xb:
            k1 = dx*f(x0,y0)
            k2 = dx*f(x0+0.5*dx,y0+0.5*k1)
            k3 = dx*f(x0+0.5*dx,y0+0.5*k2)
            k4 = dx*f(x0+dx,y0+k3)
            y0 += (k1+2*k2+2*k3+k4)/6
            x0 += dx
            x.append(x0); y.append(y0) # for vector y use y0.copy()
        return x,y
    

    然后调用为

    x,y = RK4(f=f,x0=1.0,y0=0.7182818,xb=3.0,dx=1e-3)
    plt.plot(x,y)
    #title, axis labels
    plt.grid(); plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多