如何获得某些参数的最佳值,这些参数将为我提供最高速度

How do I get the best values of certain parameters that will give me the highest velocity

提问人:Fentse 提问时间:10/16/2023 最后编辑:Fentse 更新时间:10/16/2023 访问量:18

问:

我有 2 个 ODE 方程,我使用 RK-4 方法求解,我正在尝试找到 r1、r2 和 r3 的最佳值,这将返回 v3 的最佳值。一段时间以来,我一直在尝试最大化速度,但不断出现错误。这是我最后一次代码尝试。

import numpy as np
import matplotlib.pyplot as plt


y_n = []

def calculate_v3(r3, r, r2, phi_dot, theta_dot, phi, theta):
        v3 = np.sqrt(r3**2 * theta2_dot**2 + (r - r2)**2 * theta1_dot**2 + 2 * r3 * (r - r2) * theta1_dot * theta2_dot * np.cos(theta_2 - theta_1))

    return v3

def RHS(t, y, r1, r2, r3, r):
    # ... (Same RHS function as before)
    
    m2 = p * A * r
    m1 = 5000
    m3 = 100
    theta_1, theta_2, w1, w2 = y

    f0 = w1
    f1 = w2

    r = 1  # Define 'r' appropriately

    f2 = (
        (g * np.sin(theta_1) * ((m1 * r1) - (m2 * r) - (m3 * r2))) +
        (m3 * r2) * (g * np.sin(theta_2) * np.cos(theta_1 - theta_2) - (r3 * w2**2 * np.sin(theta_1 - theta_2)) - (r2 * w1**2 * np.cos(theta_1 - theta_2) * np.sin(theta_1 - theta_2)))
    ) / (
        (m1 * r1**2) + (m2 * (((r/2) - r2)**2 + (r**2/12))) + (m3 * r2**2 * np.sin(theta_1 - theta_2)**2)
    )

    f3 = ((r3/r2) * ((w1**2 * np.sin(theta_1 - theta_2)) - (f2 * np.cos(theta_1 - theta_2)))) - (g * np.sin(theta_2))

    return np.array([f0, f1, f2, f3])


def RK4(t, y, h, f, r1, r2, r3, r):
    #Runge Kutta standard calculations
    k1 = f(t, y, r1, r2, r3, r)
    k2 = f(t + h/2, y + h/2 * k1, r1, r2, r3, r)
    k3 = f(t + h/2, y + h/2 * k2, r1, r2, r3, r)
    k4 = f(t + h, y + h * k3, r1, r2, r3, r)

    return 1/6*(k1 + 2 * k2 + 2 * k3 + k4)


def main():
    global y_n
    # Specify time interval and number of domain subintervals
    t0 = 0 
    T = 0.71
    n = 100
    # Initial conditions
    y0 = [np.pi/4, 0, 0, 0]
    
    t_n = [t0]
    y_n = [np.array(y0)]  
    
    #Step size
    h  = 0.01   
    
    while t_n[-1] < T:
        #Keep going until T is reached.
        #Store numerical solutions into y_n
        y_n.append(y_n[-1] + h * RK4(t_n[-1], y_n[-1], h, RHS))
        t_n.append(t_n[-1] + h)
        
        
    
    
    print(y_n)
    
    # Define bounds for r1, r2, r3, and r
    r1_min = 0.5
    r1_max = 1
    r2_min = 3*r1_min
    r2_max = 3*r1_max
    r3_min = 0.3
    r3_max = r2_max
    r_min = r1_min + r2_min
    r_max = r1_max + r2_max

    # Initialize variables to store the maximum velocity and corresponding parameters
    max_velocity = 0.0
    best_parameters = None

    # Iterate through parameter combinations within the specified bounds
    for r1 in np.linspace(r1_min, r1_max, num=100):
        for r2 in np.linspace(r2_min, r2_max, num=100):
            for r3 in np.linspace(r3_min, r3_max, num=100):
                for r in np.linspace(r_min, r_max, num=100):
                # ... (Rest of your code remains the same)
                # Calculate velocity for the current parameter combination
                    v3 = calculate_v3(r3, r, r2, y_n[-1][3], y_n[-1][1], varphi_dot, y_n[-1][2], y_n[-1][0])

                # Check if this velocity is greater than the current maximum
                    if v3 > max_velocity:
                        max_velocity = v3
                        best_parameters = (r1, r2, r3, r)
                   

    # Print the maximum velocity and the corresponding parameters
    print("Maximum Velocity:", max_velocity)
    print("Best Parameters (r1, r2, r3, r):", best_parameters)

main()


这是我运行它后遇到的错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-8-ba5ebab27a6e> in <module>
    103     print("Best Parameters (r1, r2, r3, r):", best_parameters)
    104 
--> 105 main()

<ipython-input-8-ba5ebab27a6e> in main()
     62         #Keep going until T is reached.
     63         #Store numerical solutions into y_n
---> 64         y_n.append(y_n[-1] + h * RK4(t_n[-1], y_n[-1], h, RHS))
     65         t_n.append(t_n[-1] + h)
     66 

TypeError: RK4() missing 4 required positional arguments: 'r1', 'r2', 'r3', and 'r'

任何帮助都会很棒。

Python 优化 微分方程最大 Runge-Kutta

评论

2赞 DeusDev 10/16/2023
您正在传递给该函数,但这未在任何地方定义。您的意思是将 is 作为函数 () 调用,其中包含其他参数吗?RHSRK4()RHS()

答: 暂无答案