У меня есть простой линейный блендер, который берет два массива и смешивает их вместе с учетом верхней и нижней границ. Я хочу сделать это обрабатывать нелинейные функции, такие как эта сигма-функция.
Оригинал представляет собой линейное смешение, где a и b смешиваются вдоль прямой (a * ds2) + (b * ds1).
Я заинтересован в попытках использовать некоторые методы нелинейного смешивания, но не уверен, как реализовать такое же истинное смешивание с помощью сигма / логистической функции или какого-то полинома? - Здесь мы фактически не смешиваем через l: h способ, которым работает линейное смешивание.
Приветствия
import matplotlib.pyplot as plt
import math
import numpy as np
def sigmaf(x):
m=np.mean(x)
a = []
for i in x:
a.append(1. / (1. + math.exp(-(i-m)/0.01)))
return a
def new_blender(ds1,ds2,h=0.2,l=0.15):
#This makes a linear blend:
a=(ds1-l)/(h-l)
b=(h-ds1)/(h-l)
out = (a*ds2)+b*ds1
#But we want something more like this:
##http://matlab.cheme.cmu.edu/2011/10/30/smooth-transitions-between-discontinuous-functions/
sig=sigmaf(ds1)
out=((1-np.array(sig))*(np.array(ds1)))+(sig*(np.array(ds2)))
#Close, but this still not blending exactly how we want
out = np.where(ds1 < l, ds1, out)
out = np.where(ds1 > h, ds2, out)
return out
def test_blender():
test_a=np.arange(0.1,0.3,0.001)
test_b=np.arange(0.3,0.5,0.001)
blend=new_blender(test_a,test_b)
#print(test_a)
#print(test_b)
#print(blend)
plt.plot(test_a)
plt.plot(test_b)
plt.plot(blend,linestyle=':',linewidth=3)
plt.show()
test_blender()