首页 > 解决方案 > TypeError:只能将元组(不是“浮动”)连接到元组

问题描述

我正在尝试用 Python 解决 Runge-Kutta。我的函数运行良好,但我需要修复它并使用 args 元组使其更加灵活。将来,我需要一个 args 元组来应用于复杂的 ODE。我试过这样:

import numpy as np

h = 0.2  #space between t

#conditions
numeroEquacoes = 2   #number of equations   
numeroPassos = 10    #step time
t = np.zeros((numeroPassos))  
r = np.zeros((numeroPassos, numeroEquacoes))

#initial conditions
r[0] = np.array([1.0, 0.0]) #omega e y
t[0] = 0.0


def fun(r, t, k):
return np.array([r[1], k * r[0]])   #this is my ODE

def rk4(funcao, varIndep, varDep, esp, numeroPassos, args = ()):
    for i in range(1, numeroPassos):
         k1 = funcao(* ((varIndep[i-1], varDep[i-1]) + args) )
         k2 = funcao(* (varIndep[i-1] + (esp*0.5), varDep[i-1] + 
         ((esp* k1)*0.5) + args) )
         k3 = funcao(* (varIndep[i-1] + (esp*0.5), varDep[i-1] + ((esp 
         * k2)*0.5) + args) )
         k4 = funcao(* (varIndep[i-1] + esp, varDep[i-1] + (esp * k3) 
         + args) )
         varIndep[i] = varIndep[i-1] + esp
         varDep[i] = varDep[i-1] + ((esp/6)*(k1 + (2 * k2) + (2 * k3+ 
         k4))
    return varDep   #returns array r 

#testing my function
a = rk4(fun, t, r, h, numeroPassos, args=(2.0))
print (a)  

我已经有了 t、r、h 和 numeroPassos 值。我的参数是 k = 2.0。执行此代码时,答案是:

TypeError: can only concatenate tuple (not "float") to tuple  

当我在此测试中使用 args = (2.0, ) 时,它会返回一条新的错误消息:

IndexError: invalid index to scalar variable.

如何解决?

标签: pythonpython-3.x

解决方案


您的代码有很多错误。先说几点:在你对“有趣”的定义中

def fun(r, t, k):
    return np.array([r[1], k * r[0]])   #this is my ODE

你根本不使用t。撇开这一点不谈,在 rk4 中,您使用的是以下行:

k1 = funcao(* ((varIndep[i-1], varDep[i-1]) + args) )

很明显,您使用的列表解包函数“fun”参数将是:r=varIndep[i-1] (**)t=varDep[i-1]。但是从您传入的参数中:a = rk4(fun, t, r, h, numeroPassos, args=(2.0,))我们看到varIndep is np.zeros((numeroPassos)) (the global t you defined)这是一个一维数组,因此是varIndep[i-1] is a float (not an array)and so (**) r is a float。当您调用“有趣”时,索引错误将来自 r 不是数组并且r[1]没有意义的事实。


推荐阅读