2015-03-04 5 views
0

Я написал код, и мне нужна помощь в реализации метода optmization, возможно, с scipy. Если вы можете отметить ниже, у меня есть переменная «pD», которую мне нужно изменить, чтобы найти результат для «abs (mFmin [i] [j] - mReg [i] [j])> 1". mFmin, mReg и все другие вычисления внутри этого времени, в то время как зависит от «pD»Реализация оптимизации Python и Scipy

Я написал плохой код, просто для тестирования, чтобы изменить «pD», сравнивая mFmin и mReg, но он слишком медленный и не работает вопрос, если я подниму ошибку или нет, этот маленький код сосет.

Я ищу некоторый код optmization в scipy-библиотеке, но я не вижу, где я могу реализовать это с помощью моего кода. Я думаю, что это Simples решение, но у меня нет никого, чтобы обменяться идеями ...

Примечание: ФД матрица

Ниже я прикрепил основную часть кода:

for i in range(0,int(x)): 
    for j in range(0,n): 
     curso[i] = i*passo 
     curso[0] = 0 
     pD[i][j] = pZref 
     mFmin[i][j] = 0 
     mReg[i][j] = gref 

# my doubt starts here 
     while abs(mFmin[i][j] - mReg[i][j]) > 1: 
      if mFmin[i][j] < mReg[i][j]: 
       pD[i][j] = pD[i][j] + 0.0001 
      else: 
       pD[i][j] = pD[i][j] - 0.0001 

      pZaux[i][j] = pE_*sqrt((pow(pZref/pE_,2)-pow(pA/pE_,2))*pow(mFmin[i][j]/gref,2)+pow(pA/pE_,2)) 

      vD[i][j] = pE_*vE_/pD[i][j] 
      if pD[i][j]/pE_ > RPcr: 
       psiR[i][j] = sqrt(pow(pD[i][j]/pE_,2/kappa)-pow(pD[i][j]/pE_,(kappa+1)/kappa)) 
      else: 
       psiR[i][j] = psicrR 
      if pZaux[i][j]/pD[i][j] > RPcr: 
       psiF[i][j] = sqrt((2*kappa/(kappa-1))*(pow(pZaux[i][j]/pD[i][j],2/kappa)-pow(pZaux[i][j]/pD[i][j],(kappa+1)/kappa))) 
      else: 
       psiF[i][j] = psicrF 

      mFmin[i][j] = 3600*psiF[i][j]*kmin*(fmin[j]/1000000)*sqrt(pD[i][j]*100000/vD[i][j]) 
      mReg[i][j] = 3600*psiR[i][j]*alpha*(fV[i][j]/1000000)*sqrt(2*kappa/(kappa-1)*(pE_*100000/vE_)) 

Спасибо за чтение!

MRM

+0

Прежде всего, используйте 'numpy' и избавьтесь от этих чистых петель python. –

+0

Любой отзыв? На самом деле, я использую numpy, чтобы я мог делать все и всю математику. Я не программист, я просто знаю основные понятия ... извините ... –

ответ

3

Вы могли бы взглянуть на пакет оптимизируют: http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

В качестве простого примера предположим, что вы ищете минимум (х-3) ** 2. Вы определяете функцию, которая получает вход, и возвращает значение функции. Вы передаете эту функцию, чтобы свести к минимуму, а также начальное предположение x0.

import numpy as np 
from scipy.optimize import minimize 
def fn(x): 
    return (3-x)**2 
x0 = 0 
res = minimize(fn, x0, method='nelder-mead', options={ 'disp': True}) 

Это возвращает 3.0, как ожидалось. Вы можете определить fn, чтобы иметь входной вектор x, а затем указать x0 в качестве вектора начальной точки с той же размерностью, что и ожидалось с помощью fn.

В примере метод «nelder-mead» - простой алгоритм, который может иметь длительное время. Если вы знаете, что грандиозность или ваша функция должны быть минимизированы, вы можете использовать более сложные алгоритмы, например. BFGS, а также передать функцию градиента, как описано в документе.

+0

Спасибо за комментарий. Я уже смотрю scipy docs, но я не вижу, как установить метод optmization внутри моей программы. –

+0

Я обновил свой ответ, чтобы привести пример и некоторое объяснение. –

0

Андрей Соболев предлагает использовать numpy, потому что ваш if pD был массивом numpy, и вы получили бы его элементы как pD[i,j], а не pD[i][j], что происходит быстрее и проще.

Если я правильно понял, каждая оптимизация [i, j] равна независимых других значений массива, не так ли? Затем вам просто нужно выполнить оптимизацию i * j (если результаты будут связаны, все будет усложняться ...)

Эта проблема может быть слишком медленной по двум причинам. Потому что оптимизация медленная, или потому, что i и j очень большие. В более позднем случае вы, вероятно, сможете значительно ускорить его работу с помощью Numba, поскольку петли for медленны в Python.

Как уже было предложено, используйте один способ в scipy.optimize для выполнения каждой оптимизации. Будьте осторожны с первоначальной догадкой, особенно если функция имеет более одного минимума.

+0

Андрей Соболев, Балинт Домокос и пользователь2783943, благодарю вас за ваши комментарии и интерес. Я буду следовать вашим инструкциям. Как только я получу его, я положил его сюда! Еще раз спасибо! –

+0

user2783943, вы правы, pD является независимым. Эта программа касается подъема клапана, где i - значение подъема (например, оно варьируется от 0 мм до 20 мм), а j - количество клапанов (он может рассчитать клапан 1, клапан 2, клапан j ...) по мере его изменения мы имеем площадь fV и дает поток с итерационно находящимся давлением (pD). Так что, как вы можете догадаться, каждый pD вычисляет один поток для каждого подъема каждого клапана. –

0

Я рекомендовал бы импортировать NumPy с:

import numpy as np 

, потому что ваша ошибка, кажется, как ваш SQRT происходит от математического модуля, а не модуль Numpy. Это может быть причиной ошибки.См TypeError: only length-1 arrays can be converted to Python scalars while trying to exponentially fit data

Еще несколько рекомендаций:

  • Там нет необходимости указывать 0 в диапазоне среза: psiR[0:,0:]==psiR[:,:]==psiR
  • создать x0 с x0 = np.ones(n) * pZref если pZref является скаляром.
  • Чтобы ознакомиться с этими конструкциями, вы должны прочитать небольшое руководство.
+0

Рамон Crehuet, спасибо за советы! Я буду следовать тому, что вы сказали. Хорошей недели! –

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