2015-08-27 5 views
0

Этот скрипт отлично работает для того, что я хочу. Это функция веса, которую я хочу свести к минимуму. Я написал внутри функции и во всем мире, и я заметил, что глобальная печать (W) является мое выражение и печать (W) внутри функции является массив значений, которые будут построены:Как использовать глобальную переменную (производное выражение) внутри функции

import numpy as np 
from sympy import * 
import matplotlib.pyplot as plt 

#Weight function 

tf = Symbol('tf') 
l = 50/(0.54*tf) - tf 
d = (tf*(2*l+2*(l-tf)/2))/(2*l*(l+tf)/2) 
W = 15.7*tf-7.85*tf*d+7.85*d*50/(0.54*tf) 
print(W) 

def func(tf): 
    l = 50/(0.54*tf) - tf 
    d = (tf*(2*l+2*(l-tf)/2))/(2*l*(l+tf)/2) 
    W = 15.7*tf-7.85*tf*d+7.85*d*50/(0.54*tf) 
    print(W) 
    return W 

b = np.linspace(1, 10, 201) 
plt.plot(b, func(b)) 
plt.xlabel("tf", fontsize=18) 
plt.ylabel("Weight", fontsize=18) 
plt.grid() 
plt.show() 

Моя проблема происходит сейчас. Я хочу, чтобы также была построена производная функции веса. Но я не могу сделать это внутри функции, потому что он распознает как число (первый элемент массива). Первая печать дает мне выражение, которое я хочу построить, но я не могу отправить это выражение внутри функции. Как можно вызвать глобальную переменную (производное выражение), которая будет использоваться внутри функции?

dW_dtf = W.diff(tf) 
print(dW_dtf) 

def funcd(tf): 
    l = M/(a*tf) - tf 
    tw = tf 
    d = (tw*(2*l+2*(l-tw)/2))/(2*l*(l+tw)/2) 
    W = 15.7*tf-7.85*tf*d+7.85*d*M/(a*tf) 
    dW_dtf = W.diff(tf) 
    return dW_dtf 

AttributeError: «numpy.ndarray» объект не имеет атрибута «диф»

Я открыт для других вариантов, чтобы сделать то, что я хочу. Я буду больше читать об оптимизации алгоритмов с помощью python, потому что мне придется решать более сложные задачи, но я хотел бы сделать такие основные проблемы без использования итерационных методов. Спасибо. Luis

ответ

0

В вашем коде вы по существу переопределяете свое глобальное определение. Прямо сейчас, когда вы вызываете func, вы переопределяете W, используя любое значение, которое вы указали как tf. В вашем случае массив. Таким образом, W больше не является символическим выражением, а явно массивом. То, что вы хотите что-то вроде этого вместо func:

def func(x): 
    w_evaluator=lambdify(tf,W) 
    return w_evaluator(x) 

И аналогично:

def funcd(x): 
    dwdt_evaluator=lambdify(tf,W.diff(tf)) 
    return dwdt_evaluator(x) 
+0

Это работает очень хорошо. Спасибо, Кристоф –

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