Как оптимизировать кусочно-непрерывную функцию Python с несколькими аргументами, содержащую условные операторы, для рабоPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как оптимизировать кусочно-непрерывную функцию Python с несколькими аргументами, содержащую условные операторы, для рабо

Сообщение Anonymous »

Я относительно новичок в программировании на Python и NumPy, но у меня есть инженерный опыт и я широко использую VBA. В настоящее время я использую Python для анализа задач газодинамики, которые включают в себя математически сложные и иногда разрывные функции (ударные волны и переходные потоки). Мне нужна помощь с программированием кусочно-непрерывных функций.
Это упрощенная версия одного аспекта того, что я делаю. У меня есть кусочно-непрерывная функция от двух переменных:
f(Re, r) = fL(Re, r), Re= 2000 для всех r
Я протестировал различные варианты вычисления f, включая циклы, векторизованный скаляр function, numpy.where(), numpy.select(), numpy.piecewise() и различные формы логического индексирования. Кажется, numpy.piecewise() предлагает наиболее элегантное решение, но я не понимаю, как работать с двумя аргументами. Надеюсь, приведенный ниже код прояснит это; любая помощь или комментарии очень приветствуются.
Есть ли способ реализовать функцию numpy.piecewise() с двумя аргументами поэлементно?
Разумно ли мое решение с логической индексацией ниже, учитывая, что массивы могут стать довольно большими?
import numpy as np

def fL(Re, r):
return 16.0/Re

def fT(Re,r):
return ((-1.8*np.log10((r/3.7)**1.11 + 6.9/Re))**-2.0)/4.0

Re = np.logspace(3., 7., 5)

# This works fine for a scalar value of r:
r = 0.0001
def f0(Re, r):
return np.piecewise(Re, [Re=2000.0], [fL, fT], r)
print('\n Re: ', Re)
print(' r: ', r)
print('f0(Re, r): ', f0(Re, r))

# This works element-wise for arrays of Re and r (which is what I want):
r = np.full_like(Re, 0.0001)
def f1(Re, r):
fct = np.zeros(len(Re))
fct[Re < 2000.0] = fL(Re[Re < 2000.0], r[Re < 2000.0])
fct[Re >= 2000.0] = f0(Re[Re >= 2000.0], r[Re >= 2000.0])
return fct
print('\n Re: ', Re)
print(' r: ', r)
print('f1(Re, r): ', f1(Re, r))

# but this does not work element-wise:
print('\n Re: ', Re)
print(' r: ', r)
print('f(Re, r): ', f0(Re, r))


Подробнее здесь: https://stackoverflow.com/questions/791 ... unction-co
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»