Я использую замечательный sympy в python, чтобы сгенерировать расширенную систему системы ODE для вычисления прямой чувствительности состояний по отношению к состояниям.Моя цель - оптимизировать систему ODE.Если бы у меня была система x1 ... x10 и параметры a1 ... a5, то расширенная система имела бы 10 + 10 * 5 состояний.Приведенный мной код sympy генерирует дополнительные состояния и присваивает их переменным x1 ... x60.
Позже я использую интеграцию в numpy для решения расширенной системы.Поэтому я должен написать функцию, которая возвращает rhs () ODE-системы - что-то вроде этот код (если кто-то из вас работает с numpy, пожалуйста, исправьте ошибку в two_springs.py, строка 29 - m2 отсутствует ).
И моя проблема: я хочу, чтобы внутри функции назначались переменные x1 ... x_end динамически (общее количество состояний будет меняться в зависимости отсколько параметров я использую для чувствительности).Я был в восторге, тогда я нашел встроенную функцию locals () в Python.С этот пост Я думал, что это должно работать:
def test_l(w, t):
for ii in range(len(w)):
varStr="a%d" % (ii)
locals()[varStr]=w[ii]
return a1*t+a0
w0 = [1.0, 1.0]
t0 = 1.0
f_x=test_l(w0, t0)
print "func res-> %1.4f\n" % (f_x)
Запуск сценария, который я получаю глобальное имя 'a1' не определено .Позже я узнал, что localst () на самом деле только для чтения .Меня смущает то, что если я отлаживаю функцию с pde на в ipython , то переменные a1 и a0 действительно существуют внутрифункция ... Запуск кода с помощью 'pdb on' Я все еще получаю сообщение об ошибке, выполнение программы останавливается на return () , но a1 и a0 фактически существуют в рабочем пространстве функции.
ipdb> a1 1.0
ipdb> a0 1.0
Как получается, что localals () доступен только для чтения, но при отладке с помощью pdb словарь может быть фактически изменен?
PS: я решил свою проблему следующим образом:
for ii in range(len(w)):
#varStr="a%d" % (ii)
#locals()[varStr]=w[ii]
varStr="a%d=w[%d]" % (ii, ii)
exec(varStr)
return a1*t+a0