데이터 재료과학 (제 5강)

함수

1. 목표

2. 클래스

파이썬에서 클래스(Class)는 나만의 새로운 데이터 타입이나 객체를 만들기 위한 ‘설계도’라고 생각할 수 있다. 이 설계도를 바탕으로 실제로 만들어진 실체를 인스턴스(Instance) 또는 객체 (Object)라고 부른다.

class Atom:
    def __init__(self):
        pass
    def add_density(self,val):
        self.density=val
    def add_structure(self,val):
        self.structure=val

## usage examples
myFe=Atom() # Atom 클래스를 활용
myFe.add_density(7.87) #7.87g/cm^3
myFe.add_structure('BCC')

myAl=Atom()
myAl.add_density(2.70)
myAl.add_structure('FCC')

3. 클래스 예제

class Alloy:
	def __init__(self, name, tensile_strength, ductility, density):
		self.name = name
		self.tensile_strength = tensile_strength  # MPa
		self.ductility = ductility                # %
		self.density = density                    # g/cm^3

# 합금 데이터
a1 = Alloy("Ni-Cu", 450, 35, 8.9)
a2 = Alloy("Al-Mg", 320, 25, 2.7)
a3 = Alloy("Ti-6Al-4V", 900, 14, 4.4)

alloys = [a1, a2, a3]

# 특정 물성(property) 가져오기
property_to_check = "tensile_strength"  # 여기만 바꾸면 됨

for alloy in alloys:
	  value = getattr(alloy, property_to_check, "N/A")
	  print(f"{alloy.name}: {property_to_check} = {value}")

4. 여러 함수 만들어 보기

4.1. Hooke’s law

\[\sigma = E \varepsilon\]
  def hooke(modulus,epsilon):
    return modulus * epsilon

수식을 Python함수로 만들려면, 각 물리량을 뜻하는 기호에 적당한 이름을 붙여 변수로 지정해야겠다. 나는 앞의 예제에서, 우선 첫번째로, 함수의 이름을 hooke이라 지었다. 그리고 변형률을 저장할 변수를 그에 해당하는 기호 $\varepsilon$ (epsilon)을 말 그대로 epsilon이라 지었고, 탄성계수(elastic modulus)에서 modulus를 사용했다. 같은 함수를 아래와 같이 작성할 수 있고, 정확히 같은 기능을 수행한다. 하지만, 전혀 추천되지 않는 이름들을 사용했다. 프로그램이 작고 간단할 때는 큰 문제가 되지 않을 수 있으나, 점점 프로그램이 커지고 복잡해지면 이와 같은 너무 간단한 이름은 선언될 때 본디 뜻하던 변수를 기억하기 쉽지 않고, 실수를 범하게 쉽게 만든다.

def a(b,c):
  return a*b

4.2. Engineering strain & true strain

\[\epsilon=\frac{\Delta l}{l_0}\]
  def calc_engi_strain(l0,l1):
    delta_l=l1-l0
    return delta_l/l0
def calc_true_strain(engi_eps):
  import math
  # math.log: log function with base of Euler's number, 2.718...
  true_eps=math.log(1+engi_eps)
  return true_eps

4.3. 길이 변화를 주면 true strain을 계산하는 함수

4.4. Schmid law

\[\tau=\sigma \cos\phi \cos\lambda\]
  def schmid(sigma,phi,lamb):
    """
    Arguments
    ---------
    sigma: float
      uniaxial stress
    phi: float (in radian)
      angle between the slip plane normal and the loading direction
    lamb: float (in radian)
      angle between the slip direction and the loading direction

    Returns
    -------
    Schmid factor
    """
    import math
    return sigma*math.cos(phi)*math.cos(lamb)

4.5. 위치 인자 (*args)를 활용한 다항함수(polynomial function) 구하기

  def poly(x,*args):
    """
    polynomial function

    y = a x^n + b x^(n-1) + c x^(n-2) ... z x^0

    Arguments
    ---------
    x,*args

    Returns
    -------
    y
    """
    n=len(args)-1 # highest order
    y=0.
    print('n,i,arg')
    for i, arg in enumerate(args):
  	  # print(n,i,arg)
  	  y+=arg*(x**n) #
  	  n-=1          # in descending order
    return y

4.6. 키워드 인자 (keyword arguments; **kwargs) 활용 예시

  def get_sum(*args):
    sum=0.
    for arg in args:
  	  sum=sum+arg
    return sum
  get_sum(1,2,3,4,5,6,7) #? what's going to be the correct answer?
  def introduce(**kwargs):
    for key, value in kwargs.items():
  	  print(f"{key}: {value}")
  introduce(name="Alice", age=25, country="Korea")

4.7. 여러 슬립계로 이루어진 재료에 가해진 응력에 따라, 가장 큰 분해 전단 응력을 가진 슬립계 찾기