如何从另一个多变量函数定义一个变量函数

时间:2014-01-24 14:16:35

标签: python numpy

我试图从多变量函数G中定义一个变量g函数:

def dG(thetaf,psi,gamma) : 
    return 0.35*(cos(psi))**2*(2*sin(3*thetaf/2+2*gamma)+(1+4*sin(gamma)**2)*sin(thetaf/2)-sin(3*thetaf/2))+sin(psi)**2*sin(thetaf/2)

 g = lambda thetaf: dG(thetaf,psi,gamma)

不幸的是,这不起作用,我收到的错误是:

  

只能将length-1数组转换为Python标量

2 个答案:

答案 0 :(得分:1)

您必须定义一些默认值。如果使用关键字参数执行此操作,则甚至不需要定义单独的函数。

from numpy import sin, cos, arange

def dG(thetaf,psi=0.5,gamma=1) : 
    return 0.35*(cos(psi))**2*(2*sin(3*thetaf/2+2*gamma)+(1+4*sin(gamma)**2)*sin(thetaf/2)-sin(3*thetaf/2))+sin(psi)**2*sin(thetaf/2)

thetaf = arange(10)
print dG(thetaf)
>>> [ 0.4902  0.1475  0.5077  1.6392  1.757   0.4624 -0.472  -0.2416 -0.2771 -1.3398]

您实际上可以定义一个单独的函数,但使用关键字默认值是更清晰的选择。

g = lambda tf: dG(tf, 0.5, 1)
g(thetaf)
array([ 0.4902,  0.1475,  0.5077,  1.6392,  1.757 ,  0.4624, -0.472 ,
       -0.2416, -0.2771, -1.3398])

答案 1 :(得分:0)

下次,请以原样的格式将脚本包含在原始问题中。它使得帮助更快。

我认为这只是一个简单的错误。你分别从gamma和psi中得到theta和phi,但是你永远不会使用它们。你的意思是在g中使用那些作为你的参数吗?如果是这样,那么它应该看起来像这样

from numpy import sin, cos, arange, linspace, pi, zeros
import scipy.optimize as opt    

def dG(thetaf, psi, gamma):
    return 0.35*(cos(psi))**2*(2*sin(3*thetaf/2+2*gamma)+(1+4*sin(gamma)**2)*sin(thetaf/2)-sin(3*thetaf/2))+sin(psi)**2*sin(thetaf/2)    

nt = 100 
np = 100 
gamma = linspace(0, pi/2, nt) 
psi = linspace(0, pi/2, np) 
x = zeros((nt, np)) 
for i, theta in enumerate(gamma):
    for j, phi in enumerate(psi):
        print('i = %d, j = %d') %(i, j) 
        g = lambda thetaf: dG(thetaf,phi,theta) 
        x[i,j] = opt.brenth(g,-pi/2,pi/2)