OpenMDAO에서 라틴 초방격 샘플링
라틴 초방격 샘플링(LHS)이란?
다변수의 층별 샘플링 기법 중 하나이며, n개의 실험수를 지정한 경우, 각 변수를 n개의 구간으로 분할하고 구간에서 랜덤하게 값을 취해 랜덤하게 조합해 가는 실험계획법이다 .
문장을 잘 모르기 때문에 pyDOE가되는 모듈이 있었으므로 시도해 보겠습니다.
설치pip install pyDOE
실험수 5개, 변수 2개로 구간의 중심을 꺼낼 경우의 실험 패턴은?
>from pyDOE import lhs
>lhs(2,5,"c")
array([[ 0.3, 0.7],
[ 0.1, 0.1],
[ 0.5, 0.9],
[ 0.9, 0.5],
[ 0.7, 0.3]])
위를 다시 실행하면 조합이 다릅니다.
추가 인수 "c"
를 지정하지 않으면 구간 내에서 무작위로 추출됩니다.
이런 느낌입니다.
OpenMDAO를 이용한 포물면의 라틴 초방격 샘플링
\begin{align}
& f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 \\
{\rm subject \: to} \: \: \:& -50.0\leq x \leq 50.0 \\
& -50.0\leq y \leq 50.0
\end{align}
Component 준비
아래의 paraboloid.py 파일 준비
paraboloid.pyfrom openmdao.api import Component
class Paraboloid(Component):
""" Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
def __init__(self):
super(Paraboloid, self).__init__()
self.add_param('x', val=0.0)
self.add_param('y', val=0.0)
self.add_output('f_xy', shape=1)
def solve_nonlinear(self, params, unknowns, resids):
"""f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
x = params['x']; y = params['y']
unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
Problem(문제) 설정
아래는 doe_paraboloid.py를 준비한다.
doe_paraboloid.py#!/bin/pyhton
from openmdao.api import IndepVarComp, Group, Problem, SqliteRecorder
from paraboloid import Paraboloid
from openmdao.drivers.latinhypercube_driver import OptimizedLatinHypercubeDriver
from openmdao.core.mpi_wrap import MPI
if MPI: # pragma: no cover
# if you called this script with 'mpirun', then use the petsc data passing
from openmdao.core.petsc_impl import PetscImpl as impl
else:
# if you didn't use `mpirun`, then use the numpy data passing
from openmdao.api import BasicImpl as impl
top = Problem(impl=impl)
root = top.root = Group()
root.add('p1', IndepVarComp('x', 50.0), promotes=['x'])
root.add('p2', IndepVarComp('y', 50.0), promotes=['y'])
root.add('comp', Paraboloid(), promotes=['x', 'y', 'f_xy'])
top.driver = OptimizedLatinHypercubeDriver(num_samples=100, seed=0, population=20, \
generations=4, norm_method=2, num_par_doe=5)
top.driver.add_desvar('x', lower=-50.0, upper=50.0)
top.driver.add_desvar('y', lower=-50.0, upper=50.0)
doe_paraboloid.py 계속top.driver.add_objective('f_xy')
recorder = SqliteRecorder('doe_paraboloid')
recorder.options['record_params'] = True
recorder.options['record_unknowns'] = True
recorder.options['record_resids'] = False
top.driver.add_recorder(recorder)
top.setup()
top.run()
top.cleanup()
루트에 Paraboloid ()를 추가 할 때 promotes를 인수로 사용하여 p1.x, comp.x 등을 자동으로 연결합니다.
이번에는 GA를 사용하여 LHS의 실험점 배치를 좋은 느낌으로 만들어주는 드라이버 인 OptimizedLatinHypercubeDriver를 사용했습니다.
OptimizedLatinHypercubeDriver의 인수에는 샘플 수는 100, 랜덤 시드 0, GA의 개체 20, 세대 4, GA 중에서 각 DOE 포인트간의 거리를 정규화하는 놈(np.linalg.norm에서 사용), num_par_doe로 병렬 화 수가 지정되었습니다.
터미널에서 다음을 수행합니다.
mpirun -np 5 python doe_paraboloid.py
결과 로드
IPythonimport numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import sqlitedict
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
res[i,0] = v[1]["Unknowns"]["x"]
res[i,1] = v[1]["Unknowns"]["y"]
res[i,2] = v[1]["Unknowns"]["f_xy"]
x = np.arange(-50, 50, 4)
y = np.arange(-50, 50, 4)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2 + X*Y + (Y+4.0)**2 - 3.0
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)
ax.scatter3D(res[:,0],res[:,1],res[:,2],c="r", marker="o")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f_xy')
plt.show()
OpenMDAO로 포물면 최소화 문제 해결
Reference
이 문제에 관하여(OpenMDAO에서 라틴 초방격 샘플링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TatsuyaKatayama/items/7bcf863bad444c6ad901
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
pip install pyDOE
>from pyDOE import lhs
>lhs(2,5,"c")
array([[ 0.3, 0.7],
[ 0.1, 0.1],
[ 0.5, 0.9],
[ 0.9, 0.5],
[ 0.7, 0.3]])
\begin{align}
& f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 \\
{\rm subject \: to} \: \: \:& -50.0\leq x \leq 50.0 \\
& -50.0\leq y \leq 50.0
\end{align}
Component 준비
아래의 paraboloid.py 파일 준비
paraboloid.pyfrom openmdao.api import Component
class Paraboloid(Component):
""" Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
def __init__(self):
super(Paraboloid, self).__init__()
self.add_param('x', val=0.0)
self.add_param('y', val=0.0)
self.add_output('f_xy', shape=1)
def solve_nonlinear(self, params, unknowns, resids):
"""f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
x = params['x']; y = params['y']
unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
Problem(문제) 설정
아래는 doe_paraboloid.py를 준비한다.
doe_paraboloid.py#!/bin/pyhton
from openmdao.api import IndepVarComp, Group, Problem, SqliteRecorder
from paraboloid import Paraboloid
from openmdao.drivers.latinhypercube_driver import OptimizedLatinHypercubeDriver
from openmdao.core.mpi_wrap import MPI
if MPI: # pragma: no cover
# if you called this script with 'mpirun', then use the petsc data passing
from openmdao.core.petsc_impl import PetscImpl as impl
else:
# if you didn't use `mpirun`, then use the numpy data passing
from openmdao.api import BasicImpl as impl
top = Problem(impl=impl)
root = top.root = Group()
root.add('p1', IndepVarComp('x', 50.0), promotes=['x'])
root.add('p2', IndepVarComp('y', 50.0), promotes=['y'])
root.add('comp', Paraboloid(), promotes=['x', 'y', 'f_xy'])
top.driver = OptimizedLatinHypercubeDriver(num_samples=100, seed=0, population=20, \
generations=4, norm_method=2, num_par_doe=5)
top.driver.add_desvar('x', lower=-50.0, upper=50.0)
top.driver.add_desvar('y', lower=-50.0, upper=50.0)
doe_paraboloid.py 계속top.driver.add_objective('f_xy')
recorder = SqliteRecorder('doe_paraboloid')
recorder.options['record_params'] = True
recorder.options['record_unknowns'] = True
recorder.options['record_resids'] = False
top.driver.add_recorder(recorder)
top.setup()
top.run()
top.cleanup()
루트에 Paraboloid ()를 추가 할 때 promotes를 인수로 사용하여 p1.x, comp.x 등을 자동으로 연결합니다.
이번에는 GA를 사용하여 LHS의 실험점 배치를 좋은 느낌으로 만들어주는 드라이버 인 OptimizedLatinHypercubeDriver를 사용했습니다.
OptimizedLatinHypercubeDriver의 인수에는 샘플 수는 100, 랜덤 시드 0, GA의 개체 20, 세대 4, GA 중에서 각 DOE 포인트간의 거리를 정규화하는 놈(np.linalg.norm에서 사용), num_par_doe로 병렬 화 수가 지정되었습니다.
터미널에서 다음을 수행합니다.
mpirun -np 5 python doe_paraboloid.py
결과 로드
IPythonimport numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import sqlitedict
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
res[i,0] = v[1]["Unknowns"]["x"]
res[i,1] = v[1]["Unknowns"]["y"]
res[i,2] = v[1]["Unknowns"]["f_xy"]
x = np.arange(-50, 50, 4)
y = np.arange(-50, 50, 4)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2 + X*Y + (Y+4.0)**2 - 3.0
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)
ax.scatter3D(res[:,0],res[:,1],res[:,2],c="r", marker="o")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f_xy')
plt.show()
OpenMDAO로 포물면 최소화 문제 해결
Reference
이 문제에 관하여(OpenMDAO에서 라틴 초방격 샘플링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TatsuyaKatayama/items/7bcf863bad444c6ad901
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from openmdao.api import Component
class Paraboloid(Component):
""" Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
def __init__(self):
super(Paraboloid, self).__init__()
self.add_param('x', val=0.0)
self.add_param('y', val=0.0)
self.add_output('f_xy', shape=1)
def solve_nonlinear(self, params, unknowns, resids):
"""f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
x = params['x']; y = params['y']
unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
아래는 doe_paraboloid.py를 준비한다.
doe_paraboloid.py
#!/bin/pyhton
from openmdao.api import IndepVarComp, Group, Problem, SqliteRecorder
from paraboloid import Paraboloid
from openmdao.drivers.latinhypercube_driver import OptimizedLatinHypercubeDriver
from openmdao.core.mpi_wrap import MPI
if MPI: # pragma: no cover
# if you called this script with 'mpirun', then use the petsc data passing
from openmdao.core.petsc_impl import PetscImpl as impl
else:
# if you didn't use `mpirun`, then use the numpy data passing
from openmdao.api import BasicImpl as impl
top = Problem(impl=impl)
root = top.root = Group()
root.add('p1', IndepVarComp('x', 50.0), promotes=['x'])
root.add('p2', IndepVarComp('y', 50.0), promotes=['y'])
root.add('comp', Paraboloid(), promotes=['x', 'y', 'f_xy'])
top.driver = OptimizedLatinHypercubeDriver(num_samples=100, seed=0, population=20, \
generations=4, norm_method=2, num_par_doe=5)
top.driver.add_desvar('x', lower=-50.0, upper=50.0)
top.driver.add_desvar('y', lower=-50.0, upper=50.0)
doe_paraboloid.py 계속
top.driver.add_objective('f_xy')
recorder = SqliteRecorder('doe_paraboloid')
recorder.options['record_params'] = True
recorder.options['record_unknowns'] = True
recorder.options['record_resids'] = False
top.driver.add_recorder(recorder)
top.setup()
top.run()
top.cleanup()
루트에 Paraboloid ()를 추가 할 때 promotes를 인수로 사용하여 p1.x, comp.x 등을 자동으로 연결합니다.
이번에는 GA를 사용하여 LHS의 실험점 배치를 좋은 느낌으로 만들어주는 드라이버 인 OptimizedLatinHypercubeDriver를 사용했습니다.
OptimizedLatinHypercubeDriver의 인수에는 샘플 수는 100, 랜덤 시드 0, GA의 개체 20, 세대 4, GA 중에서 각 DOE 포인트간의 거리를 정규화하는 놈(np.linalg.norm에서 사용), num_par_doe로 병렬 화 수가 지정되었습니다.
터미널에서 다음을 수행합니다.
mpirun -np 5 python doe_paraboloid.py
결과 로드
IPythonimport numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import sqlitedict
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
res[i,0] = v[1]["Unknowns"]["x"]
res[i,1] = v[1]["Unknowns"]["y"]
res[i,2] = v[1]["Unknowns"]["f_xy"]
x = np.arange(-50, 50, 4)
y = np.arange(-50, 50, 4)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2 + X*Y + (Y+4.0)**2 - 3.0
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)
ax.scatter3D(res[:,0],res[:,1],res[:,2],c="r", marker="o")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f_xy')
plt.show()
OpenMDAO로 포물면 최소화 문제 해결
Reference
이 문제에 관하여(OpenMDAO에서 라틴 초방격 샘플링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TatsuyaKatayama/items/7bcf863bad444c6ad901
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import sqlitedict
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
res[i,0] = v[1]["Unknowns"]["x"]
res[i,1] = v[1]["Unknowns"]["y"]
res[i,2] = v[1]["Unknowns"]["f_xy"]
x = np.arange(-50, 50, 4)
y = np.arange(-50, 50, 4)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2 + X*Y + (Y+4.0)**2 - 3.0
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)
ax.scatter3D(res[:,0],res[:,1],res[:,2],c="r", marker="o")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f_xy')
plt.show()
Reference
이 문제에 관하여(OpenMDAO에서 라틴 초방격 샘플링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TatsuyaKatayama/items/7bcf863bad444c6ad901텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)