2014-11-02 2 views
0

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

+1

Вы можете дать дополнительную информацию о своем коде? Это линейный скрипт? Если это так, вы можете быстро превратить его в функцию. Если у вас есть функция, вы можете заглянуть в 'scipy.optimize' найти оптимальный scipy.optimize: http://docs.scipy.org/doc/scipy-0.14.0/reference/optimize.html – tvandenbrande

+0

@tvandenbrande I «Мне жаль, что я действительно не очень хорошо разбираюсь в программировании, поэтому я не знаю, является ли это линейным скриптом. Что это значит? – Spencer

+0

Вы используете классы в python или нет? Если нет, то вы, вероятно, используете линейный скрипт. Можете ли вы разместить здесь свой код, чтобы мы могли посмотреть на него? – tvandenbrande

ответ

1

Если вы правы, вы рассчитываете S [1], S [2] и S [3] вправо? Попробуйте переписать код, так что вы получите что-то вроде:

def getSpin(L1,L2,d): 
    ...all your calculations will be done here.. 
    # return the value of S[2] minus the goal value, optimization can find 0 
    return S[2]-1.0 

Для достижения оптимального результата, используйте scipy.optimize -package и оценить на S [2]. Чтобы сделать это, убедитесь, что scipy установлен на вашем компьютере. Код ниже - это первое предложение с моей стороны и, тем самым, еще не проверено/отлажено, поэтому, пожалуйста, проверьте documentation of the solver. В этом коде x0 необходимо заполнить границы. Если вы поместите минимальное и максимальное значение определенного параметра, равного eachother, решатель примет этот параметр, зафиксированный на этом значении, и изменит только другие параметры.

from scipy.optimize import minimize 

x0=(0.203, 5.653, 0.189089089089089) # your initial guess 
bounds=((l1min,l1max),(l2min,l2max),(dmin,dmax)) # the minimum and maximum values for each parameter 

res=minimize(getSpin,x0,method=‘SLSQP’,args=(),bounds=bounds,tol:1e-10) 
#res.x contains the optimized values for L1,L2 and d 
+0

Большое вам спасибо! – Spencer

+0

Нет проблем. Если ответ будет выполнен, примите его, чтобы другие знали, что это рабочее решение. – tvandenbrande