2014-01-24 3 views
0

Я пытаюсь определить одну переменную функцию г из многофакторной функции 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) 

, к сожалению, это не работает, и ошибки, которые я получаю, что:

только длина-1 массивы могут быть преобразованы в скаляры Python

+0

, связанные, может быть: [Вычисление косинуса для массива в Python] (http://stackoverflow.com/q/21043644/846892) –

+0

Просто, чтобы очистить это вверх, являются аргументами скаляры или массивы? – cc7768

ответ

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]) 
+0

Это не то, что я хочу сделать, я определяю свою функцию dG, с тремя переменными thetaf, psi, gamma и i хотел бы найти корень этой функции, в случае: 'gamma = linspace (0, pi/2, nt) ' ' psi = linspace (0, pi/2, np) ' – Abdallah

+0

Вот что я написал в своем скрипте: 'def dG (thetaf, psi, gamma): ' return 0.35 * (сов (фунтов на квадратный дюйм)) ** 2 * (2 * Sin (3 * thetaf/2 + 2 * гамма) + (1 + 4 * Sin (гамма) ** 2) * Sin (thetaf/2) -sin (3 * thetaf/2)) + Sin (фунтов на квадратный дюйм) ** 2 * Sin (thetaf/2) ' ' нт = 100' 'нп = 100'' гамма = LINSPACE (0, р/2, нт) ' 'psi = linspace (0, pi/2, np)' 'x = нули ((nt, np))' 'для i, theta in enumerate (gamma): ' ' для j, phi в перечислении (psi): ' ' print ('i =% d, j =% d')% (i, j) ' ' g = lambda thetaf: dG (thetaf, psi, gamma) ' ' x [i, j] = optimize.brenth (g, -pi/2, pi/2) ' – Abdallah

0

В следующий раз, пожалуйста, включите скрипт в свой исходный вопрос в хорошем формате. Это помогает ускоряться.

Я думаю, что это просто ошибка. Вы получаете theta и phi из гаммы и psi соответственно, но тогда вы никогда их не используете. Вы имели в виду использовать их в качестве параметров в 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) 
+0

Да, это моя вина, Обычно это gammas = linespace а также psi linepace гамма в клизурате (гамма), psi в перечислении (psis) как я могу построить решение x в 3d плане (гамма, psis), используя mplot3d @ cc7768 – Abdallah

+0

Хорошо, это ответ на ваш первоначальный вопрос , Пожалуйста, поддержите и примите. Начните новый вопрос и покажите, что вы попробовали, и я могу помочь. – cc7768

Смежные вопросы