36
[103] 001 m#math practice by www.msharpmath.com [103] 001 revised on 2013.03.06 m#math The Simple is the Best 단단단단단 단단단단 "ans" 단단단단(command window)단단 단단단단 단단 단단(cursor) "#>" 단단단단 단단단단. 단단 단단, 단단단단 3+ 45 단 단단단 단단단 단단단 #> 3 + 4 * 5 단 단단단단 단단단(return key, 단)단 단단 ans = 23 단 단단 단단단 단단단. 단단단 단단 "ans"단 m#math 단단 단단단 단단단단단 단단(equal)단 단단 단단단 단단단 단단단단. 단단단, 단단단 단단 단단단 단단 단단단단 단단단단 단단단단 단단단 단단 "ans"단 단단단단 단단. 단단단 단단단 단단단 단단 "ans"단 단단단단단 단단단단 단단단단단 단단단단단 단단. 단단 단단, 단단 단단단 단단단단 #> ans*100 + 5 단 단단단단 "ans"단 단단단 단 "23"단 단단단단 ans = 2305 단 단단단 단단, 단단단단 "ans"단단 단단 단단 단단단 단단 단단단단. (단단 1) 5 단단 단단 단단단단단 단단단단단, 200 단단단 7 단단 100 단단단 3 단단 단단단단단. (1) 단단단 단단단단? 1

Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

Embed Size (px)

Citation preview

Page 1: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

[103] 001 revised on 2013.03.06 m#math

The Simple is the Best

단순계산과 특수변수 "ans"

명령어창(command window)에서 명령어는 항상 커서(cursor) "#>" 다음부터 입력한다. 예를 들어, 단순계산 3+4∗5 의 결과를 구하고 싶으면

#> 3 + 4 * 5

을 입력하고 리턴키(return key, ¬)를 치면

ans = 23

와 같은 결과를 얻는다. 위에서 변수 "ans"는 m#math 에서 정의된 특수변수로 등호(equal)가 없는 수식의 결과가 저장된다. 따라서, 위에서 얻은 결과를 바로 이어지는 명령에서 사용하고 싶으면 변수 "ans"를 사용하면 된다. 그러나 새로운 결과가 다시 "ans"에 저장되므로 연속되는 계산에서만 사용하도록 한다.

예를 들어, 위의 계산에 계속하여

#> ans*100 + 5

을 실행하면 "ans"에 저장된 값 "23"을 이용하여

ans = 2305

인 결과를 얻고, 특수변수 "ans"에는 이제 위의 새로운 값이 저장된다.

(문제 1) 5 명이 함께 공동비품을 구매하는데, 200 원짜리 7 개와 100 원짜리 3개를 구입하였다. (1) 총액은 얼마인가?(2) 1 인당 얼마를 내야할까?

특수변수 "ans"를 이용하는데, 두 번의 명령을 수행하여 구해보라. ◀

1

Page 2: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

m#math 에서의 단위

m#math 의 특징 중의 하나는 단위변환 기능이다. m#math 에서, 어떤 단위계에서의 값 x 를 다른 단위계에서의 값으로 변환하는 것은

x.unitname (예를 들어, 5.ft=60.in=1.524.m=152.4cm=1524.mm)

의 형태로 처리한다 (unitname 은 길이 ft, 무게 lb 와 같은 단위이름). 단위변환의 결과는 일관성을 유지하도록, 기본적인 m#math 에서의 단위를 아래와 같이 정의한다 (다른 단위는 매뉴얼을 참고한다).

[kg] [s] [m] [m^2] [m^3] [m/s] [K] [kN] [kJ] [kW] [kPa] [kN.m]

m#math 의 기본단위가 어떤 것인지 매번 참조하기 어려운 점을 고려하여, 명령어창이 새로 생성될 때마다 위의 정보가 항상 출력된다. m#math 에서의 단위에서 특히 주의할 점은

force[kN], energy[kJ], power[kW], pressure[kPa], torque[kN.m]

의 경우 킬로(10 의 세제곱)단위가 기본단위라는 점이다. 이것은 공학적인 측면에서 현실적인 단위를 우선시한 것이다.

"한 방에" 단위변환 (all-in-one unit conversion)

무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한 변환은 위에서 서술한 바와 같이, m#math 의 명령어 "x.unitname" 를 이용한다. 이때, 오직 한 개의 단위변환 명령어 다음에 바로 리턴키(¬)가 이어질 경우에는 단위 전체에 대한 변환결과를 출력한다. 예를 들어

#> 3.4.lb

1.54221 kg 1.54221e+006 mg 1542.21 g

2

Page 3: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

0.00154221 ton 7515.66 kt (carat)

3.4 lb (pound mass) 54.4 oz (ounce mass) 0.105675 slug 0.242857 stone 23800 gr (grain) 0.0017 Ton (English ton)

ans = 1.5422141

위에서, 특수변수 "ans"에 저장되는 값은 첫 번째 나타나는 MKS 단위에 대한 변환결과이다. 그리고, 명령어 "3.4.lb" 에서 도트(.)는 두 번 쓰이지만 "3.4.lb"의 숫자(3.4)에 사용되는 도트(.)과 단위변환을 위한 도트(.)는 서로 구분된다는 점에 주목한다. 위의 결과를 일반화하면 다음과 같다.

"x.unitname"인 명령어와 리턴키(¬)를 입력하면 다른 단위로의 변환결과가 출력되고, 특히 첫 번째 값은 m#math 에서 기본단위값이 된다. 그리고 특수변수 "ans"에는 변환된 값, 즉 첫 번째 단위값이 저장된다.

(문제 2) 압력 15 psi (pound per square inch)는 1 기압, 1kPa 등의 여러 압력단위로는 어떻게 나타나는가?

뒤섞인 단위변환 (mixed unit conversion)

압력 P, 체적 V, 온도 T 에 대한 계산 PV /T 을 계산할 때 여러 단위가 섞여있는 경우를 생각해보자. 예를 들어, 영미단위계와 MKS 단위계에서 각각 주어진 데이터

P = 300 torr = 39.9967 kPa V = 3.2 barrel = 0.5088 m3

T = 30o C = 303.15 K

에 대해서

#> 300.torr * 3.2.barrel / 30.c

3

Page 4: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

ans = 0.0671295

#> 39.9967 * 0.5088 / 303.15

ans = 0.0671295

와 같이 섞인 단위계에서 그대로 PV /T를 계산하여도 항상 MKS 단위계에서의 값으로 변환된 후 계산되므로 단위변환에 대해서 신경쓸 필요가 없다.

(문제 3) 위치에너지 Ep=mgh 를 kJ 단위로 구하려고 한다. 질량 m=12 lb, 높이 h=5 ft 인 경우 위치에너지를 구하라. 이때

#> _g ans = 9.80665#> 1.J 0.001 kJ ans = 0.001

임을 이용하라.

m=1kg , h=1m 인 경우 위치에너지는

Ep=mgh=(1 ) (9.80665 ) (1 ) J=0.0098 kJ

인 결과를

#> (1 * _g * 1).J ans = 0.00980665

으로 구하는 것을 활용한다. ◀

비선형방정식(nonlinear equation)의 근(root) 구하기

x를 미지수로 하는 비선형방정식

f ( x )=g (x)

4

Page 5: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

의 근을 구하는 m#math 명령어는

solve .x {a} ( f(x) = g(x) )

이다. 근이 여러 개 있을 수 있으므로x=a근처에서 근을 조사하는데 a=0.41 값을 디폴트로 사용하여 {a} 은

solve .x ( f(x) = g(x) )

와 같이 생략할 수 있다.

아래의 그림을 보면 방정식 ex=2x+3 은 두 개의 근을 갖는다.

y=ex 와 y=2x+3 의 그래프

근을 구하기 위하여 근이 존재할 것같은 값의 근처에서 근을 찾는다(수치적으로는 할선법으로 근을 구한다).

#> solve.x ( exp(x) = 2*x+3 ) ans = -1.3733745

#> solve.x {2} ( exp(x) = 2*x+3 ) ans = 1.9239388

또는 구간을 정하고 그 내부를 100 등분하여 각각의 구간에서 근을 찾아 모두 구하는 방법을 쓰려면

#> solve.x {2} ( exp(x) = 2*x+3 ) .span(-3,3) ans = [ -1.37337 8.17867e-008 ] [ 1.92394 4.24104e-009 ]

5

Page 6: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

와 같이 "Spoke" 중에서 내부의 모든 근을 구하는 ".span(a,b)"을 덧붙이면 된다.

(문제 4) 열역학에서 반데어발스 (van der Waals) 상태식은

( p+ av2 ) (v−b )=RT

으로 주어지고, 질소기체에 대해서

b=0.001381 m3 /kg, a=0.17456 kPa ⋅m6/kg2, R=0.2938 kJ / kg ⋅K

임이 알려져 있다. 이때 p=2000 kPa, T=300 K 인 경우에 대해서 v의 값을 구하라.

m#math 에서 거듭제곱 xa 은 x^a 으로 계산한다. ◀

연립방정식의 근 구하기

연립방정식의 근은 미지수의 갯수에 따라 다음과 같은 형태로 구한다. 방정식은 최대 9 개까지 연립하는 경우를 다룬다.

solve.x.y {a,b} ( u(x,y)=0, v(x,y)=0 ) solve.x.y.z {a,b,c} ( u(x,y,z)=0, v(x,y,z)=0, w(x,y,z)=0 )

간단한 예로서

#> solve.a.b ( a+b = 3, a*b = 2 ) ans = [ 2 ] [ 1 ]

연립방정식의 근은 해를 초기위치를 가정하여 그 근처에 있을 것같은 하나의 해만을 탐색한다는 것을 잊으면 안된다.

6

Page 7: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

(문제 5) 원과 직선이 만나는 점을 (1,1) 근처에서 찾아라.x2+ y2=4 , y=2x−1

수치적분

수치적분은 1차적분, 2 중적분, 3 중적분의 세 가지 형태를

int.x(a,b) ( f(x) ) int.x(a,b).y(u(x),v(x)) ( f(x,y) )int.x(a,b).y(u(x),v(x)).z(p(x,y),q(x,y)) ( f(x,y,z) )

인 문법으로 구한다. 예를 들어, 아래의 적분은

∫1

2

∫x

2 x+1

e− x− y sin ( x+ y )dy dx

#> int.x(1,2).y(x,2*x+1) ( exp(-x-y)*sin(x+y) ) ans = -0.0089769673

으로 구한다.

(문제 6) 다음의 적분을 수치적으로 확인하라.

∫0

1 11+x2 dx=π

4

∫0

3

∫1

x

∫z−x

z+ x

[ e2 x (2 y−z ) ] dzdy dx=18+59 e6

8

실수의 연산

실수에 대한 연산을 위하여 다양한 연산자가 개발되어 있다.

|a| // absolute-a // unary minus!a // return 1 if a=0, otherwise return 0

7

Page 8: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

a + b // additiona - b // subtractiona * b // multiplication

a / b // right division, ab

a \ b // left division, ba

a ^ b // power, ab

a % b // remainder, r in a=pb+r

a += b // a = a+b a -= b // a = a-ba *= b // a = a*ba /= b // a = a/ba ^= b // a = a^b a %= b // a = a%b

간단한 계산예를 아래에 제시한다.

#> a = -1.7 a = -1.7

#> |a| ans = 1.7

#> a *= 100 a = -170

#> !a

ans = 0

(문제 7) x=−1.7 일 때 | x+3∨+|2 x+5|+¿ x−3∨¿의 값은 얼마인가.

다항식의 선언

오름다항식(ascending polynomial)

8

Page 9: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

p ( x )=a0+a1 x+a2 x2+a3 x3+⋯+an xn

p(x) = a0 + a1 x + a2 x^2 + a3 x^3 + … + an x^n

poly( a0, a1, a2, a3, … , an ) [ a0, a1, a2, a3, … , an ] .apoly

간단한 예

#> poly( 1,2,3,4,5 ) ans = poly( 1 2 3 4 5 ) = 5x^4 +4x^3 +3x^2 +2x +1

#> [ 1,2,3,4,5 ].apoly ans = poly( 1 2 3 4 5 ) = 5x^4 +4x^3 +3x^2 +2x +1

내림다항식(descending polynomial)

p ( x )=an xn+⋯+a3 x3+a2 x2+a1 x+a0

p(x) = an x^n +… + a3 x^3 + a2 x^2 + a1 x + a0

[ an, … , a3, a2, a1, a0 ] .dpoly .[ an, … , a3, a2, a1, a0 ] .[ a ] // constant polynomial.[ a, b ] // 1st-order polynomial, ax+b .[ a, b, c ] // 2nd-order polynomial, ax^2+bx+c.[ a, b, c, d ] // 3rd-order polynomial, ax^3+bx^2+cx+d

간단한 예제

#> .[ 1,2,3,4,5 ] ans = poly( 5 4 3 2 1 ) = x^4 +2x^3 +3x^2 +4x +5

#> .[ 1,3,2 ] y = x^2 + 3x + 2 roots [ -1 ] [ -2 ] vertex at ( -1.5, -0.25 )

9

Page 10: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

y_minimum = -0.25 y-axis intersect ( 0, 2 ) symmetry at x = -1.5 directrix at y = -0.5 focus at ( -1.5, 0 )

#> .[] ans = poly( 0) = 0

#> p = q = r = .[] p = poly( 0) = 0 q = poly( 0) = 0 r = poly( 0) = 0

다항식에 대한 단항연산자(unary operator)

단항연산자

-p // unary minus p’ // dp(x)/dx, derivative p~ // int_0^x p(x) dx, integration p.’ // p(x)-p(x-1), finite differencep.~ // p(1)+p(2)+…+p(n), cumulative sum

p ( x )=x3 , dpdx

=3 x2

#> .[1,0,0,0]' ans = poly( 0 0 3 ) = 3x^2

p ( x )=x3 , p ( x )−p (x−1 )=3 x2−3 x+1

#> .[1,0,0,0].' ans = poly( 1 -3 3 )

10

Page 11: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

= 3x^2 -3x +1

p ( x )=x3 ,∫0

x

x3dx= x4

4

#> .[1,0,0,0]~ ans = poly( 0 0 0 0 0.25 ) = 0.25x^4

p ( x )=x3,13+23+33+43+⋯+x3=14

x2 ( x+1 )2

#> .[1,0,0,0].~ ans = poly( 0 0 0.25 0.5 0.25 ) = 0.25x^4 +0.5x^3 +0.25x^2

(문제 8) 다음의 수열합을 구하라.

∑k =1

n

3 k2−5k+4 ,∑k=1

n

2k4−k2

(문제 9) 수열 an 의 합을 Sn 라고 하면 an=Sn−Sn−1, n>1 이 성립한다. 어떤

수열의 합이 Sn=n4−n2 이라고 하면 수열을 구하라.

다항식에 대한 이항연산자(binary operator)

다항식에 대한 연산을 위하여 다양한 연산자가 개발되어 있다.

p + q // additionp - q // subtractionp * q // multiplicationp / q // quotient(right division)q \ p // quotient(left division)p % q // remainderP %% q // synthetic division

11

Page 12: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

간단한 예제

p ( x )=3 x2+4 x+5 ,q (x )=x+2

#> p = .[3,4,5]; q = .[1,2]; p = poly( 5 4 3 ) = 3x^2 +4x +5 q = poly( 2 1 ) = x +2

#> p + q ans = poly( 7 5 3 ) = 3x^2 +5x +7

#> p - q ans = poly( 3 3 3 ) = 3x^2 +3x +3

#> p * q ans = poly( 10 13 10 3 ) = 3x^3 +10x^2 +13x +10

p ( x )=q ( x ) (3 x−2 )+9 에서 몫과 나머지를 구하는 연산자는 다음과 같다.

#> p / q ans = poly( -2 3 ) = 3x -2

#> p % q ans = poly( 9 ) = 9

(문제 10) 다음의 다항식을 전개하여라.(3 x2−5 x+7 )3−(5 x+4 x2 ) ( x3−6 x2+15 x+24 )+32 ( x−17 )2

다항식의 값

p(x) // double

12

Page 13: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

p(z) // complexp(q) // polynomialp(A) // matrix (element-by-element)p[A] // matrix polynomial, a0 I+a1 A+a2 A^2 + …

p ( x )=x2

#> p = .[1,0,0] p = poly( 0 0 1 ) = x^2

p (3 )=32=9#> p(3) ans = 9

p (3+i )=(3+i)2=8+6 i#> p(3+1i) ans = 8 + 6!

p (3x+4 )=(3 x+4)2=9 x2+24 x+9#> p( .[3,4] ) ans = poly( 16 24 9 ) = 9x^2 +24x +16

p([1 23 4])=[12 22

32 42]=[1 49 16]

#> p( [1,2;3,4] ) ans = [ 1 4 ] [ 9 16 ]

p([1 23 4])=[1 2

3 4]2

=[ 7 1015 22]

#> p[ [1,2;3,4] ] ans = [ 7 10 ] [ 15 22 ]

다항식의 멤버함수

13

Page 14: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

튜토리얼에는 상당히 많은 멤버함수가 제공되지만 몇 개만을 아래에 다룬다.

p.solve // rootsp.pow(k) // replace x by x^k, p[i*k]=p[i]p.shift(k) // replace x by x-kp.up(k) // multiply by x^k, p[i+k]=p[i]p.newton(u) // a0+a1(x-u1)+a2(x-u1)(x-u2)+…

#> .[1,2,5].solve ans = [ -1 - i 2 ] [ -1 + i 2 ]

p ( x )=x2 , p ( x3 )=x6

#> p = .[1,0,0]; p.pow(3); p = x^2 ans = x^6

p ( x )=x2 , p (x−2 )=( x−2 )2=x2−4 x+4#> p.shift(2) ans = = x^2 -4x +4

p ( x )=x2 , p (x ) x3=x2 x3=x5

#> p.up(3) ans = x^5

복소수의 선언

1i, 1j, 1! // i or j works only after digits 0-9x+y! // postfix ! for pure imaginary part (r+t!).cyl // r cos(t) + r sin(t) !

#> 1i ans = 0 + 1!

#> 1j ans = 0 + 1!

14

Page 15: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

#> 1! ans = 0 + 1!

#> 3+pi! ans = 3 + 3.14159!

#> (3+pi!).cyl ans = -3 + 3.67394e-016!

복소수 연산과 복소수의 원소

z = x+y! |z| // absolute value~z // conjugate, x-y! z.x, z.real // real part, xz.y, z.imag // imaginary part, xz.r, z.abs // equal to |z|=sqrt(x*x+y*y)z.t, z.arg // phase part in radian, tan^-1(y/x)z.deg // phase part in degree

#> z = 3+4i z = 3 + 4!

#> |z| ans = 5

#> ~z ans = 3 - 4!

#> z.y ans = 4

#> z.r ans = 5

#> z.t ans = 0.92729522

#> z.deg

15

Page 16: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

ans = 53.130102

(문제 11) 다음을 구하라.

(3−4 i ) (2+5i ) , 2+5 i3−4 i

복소수와 실수에서 주의할 점

m#math 에서는 C언어와 마찬가지로 형(type)선언이 이루어지면 데이터 형을 바꿀 수 없다. 다시 말해서, 실수로 선언되면 실수, 복소수로 선언되면 복소수로 처리된다.

함수 sqrt(x)에서

x 가 실수이면 sqrt(x)는 실수를 리턴하고,x 가 복소수이면 sqrt(x)는 복소수를 리턴한다.

#> sqrt(-1) ans = -1.#IND

#> sqrt(-1+0i) ans = 6.12323e-017 + 1!

Tuples

다차원 공간에서 점의 좌표는

(x1,x2,x3, ... , xn)

의 형태로 나타내고, 이러한 형태를 tuple 이라고 한다. m#math 에서는 실수뿐아니라 여러 형태의 데이터를 모아서 tuple 을 생성한다.

#> (a,b) = (1,2) a = 1 b = 2

16

Page 17: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

#> (b,a) = (a,b) b = 1 a = 2

위에서, tuple 을 이용하여 두 변수의 값을 바꾸는 방법에 주목한다.

논리상수 0 과 1, 논리연산자

C언어와 m#math 에서는 논리상수로 0 과 1 을 사용한다. 참은 0 이 아닌 모든 실수에 대응하고, 거짓은 0 에 대응한다.

논리의 부정, !xx 0 0 이 아닌 실수!x 1 0

and 연산자&& 0 10 0 01 0 1

#> [ 0 && 0, 0 && 1, 1 && 0, 1 && 1 ] ans = [ 0 0 0 1 ]

or 연산자|| 0 10 0 11 1 1

#> [ 0 || 0, 0 || 1, 1 || 0, 1 || 1 ] ans = [ 0 1 1 1 ]

exclusive and 연산자!& 0 10 1 01 0 1

#> [ 0 !& 0, 0 !& 1, 1 !& 0, 1 !& 1 ]

17

Page 18: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

ans = [ 1 0 0 1 ]

exclusive or 연산자!| 0 10 0 11 1 0

#> [ 0 !| 0, 0 !| 1, 1 !| 0, 1 !| 1 ] ans = [ 0 1 1 0 ]

관계연산자

관계연산자는 참(1) 또는 거짓(0)을 결과로 가지는 연산자로

a > b // greater thana < b // less thana >= b // greater than or equal toa <= b // less than or equal toa == b // equal toa != b // not equal to

인 여섯가지가 있다. 위에서 특히 주의할 것은 두 수가 같다는 것은 2 개의 문자로 이루어진 == 을 연산자로 가진다는 점이다. 무의식적으로 a = b 와 같이 사용하여 논리상의 오류가 발생하는 경우가 가끔 있으므로 주의해야 한다.

#> 3 > 2 ans = 1

#> 3 < 2 ans = 0

#> 3 >= 2 ans = 1

#> 3 <= 2 ans = 0

#> 3 == 2 ans = 0

18

Page 19: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

#> 3 != 2 ans = 1

배열 (array)

배열은 형선언자(double, complex, matrix, poly, vertex 등의 명령어) 다음에 배열이름과 [] 내부에 배열의 크기를 지정한다.

이때, 가장 주의해야 할 점은 배열의 첨자는 0 부터 시작한다는 점이다. 그리고 배열을 선언할 때 초기값이 지정되지 않으므로 임의의 값이 저장되어 있다는 점이다. 아래의 예를 살펴본다.

#> double x[5] #> x[0] = 3 ans = 3#> x[1] = 5 ans = 5#> x x = double [5] [0] = 3 [1] = 5 [2] = 2.0694473e+161 [3] = 1.8875371e+219 [4] = 3.7699368e-317

특히, 배열의 범위를 벗어나면 심각한 시스템오류가 발생한다. MATLAB 에서는 배열의 크기가 자동적으로 증가하여 실행오류가 발생하지 않지만 m#math 는 C언어와 마찬가지로 배열의 크기를 조사하지 않는다.

위의 예제에서 x[5] 를 사용하면 프로그램이 불시에 정지할 수 있다.

3 항 연산자 ? :

3 항연산자는 단 한가지가 정의되어 있다.

a ? b : c // b if a is true, otherwise c

19

Page 20: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

위에서 a 가 참이면 b 를 선택하고, 거짓이면 c 를 선택한다. 물론 참은 0 이 아닌 숫자에 따른 결과이다.

#> 3 ? 10 : 20; ans = 10

#> 0 ? 10 : 20; ans = 20 3 항 연산자를 이용하여 두 수의 최대값, 최소값을 구할 수 있다.

#> (a,b) = (2,3); .max(a,b); .min(a,b); a = 2 b = 3 ans = 3 ans = 2

#> a > b ? a : b b = 3

#> a < b ? a : b a = 2

증가연산자(++), 감소연산자(--)

변수값을 1 씩 증가시키거나 또는 감소시키는 방법으로 증가연산자(++) 또는 감소연산자(--)를 사용한다. 이때, 변수의 앞에 오는 경우와 뒤에 오는 경우를 다음과 같이 구별한다.

Prefix : Variable is increased/decreased ‘before use’++a // a = a+1--a // a = a-1

#> a = 1; b = ++a; a = 1 b = 2

위에서 a 의 값은 b 에 할당하기 전에 먼저 1 을 증가시키므로 최종적으로

20

Page 21: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

저장된 값은

#> a; b; a = 2 b = 2

으로 된다.

Postfix : Variable is increased/decreased ‘after use’a++ // a = a+1a-- // a = a-1

#> a = 1; b = a++; a = 1 b = 1

위의 경우에는 ++ 연산자가 뒤에 있으므로 값을 증가시키기 전의 값인 1 을 b에 할당하고 난 다음에 값을 증가시키므로, 최종값은 다음과 같다.

#> a; b; a = 2 b = 1

조건제어 if - else

cond 을 참과 거짓을 판단하는 조건(condition)문이라고 할 때, if-else 는 다음과 같이 사용된다.

if(cond) stmt; // if cond == true, stmt is executed

if(cond) stmt1; // if cond == true, stmt1 is executedelse stmt2; // if cond == false, stmt2 is executed

#> x = 2; s = 3; x = 2 s = 3

if (x == 1) s += 10;

21

Page 22: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

else if(x == 2) s *= 10; else if(x == 3) s /= 10;

s = 30

순환문 while

어떤 실행문의 집합을 계속 반복하는 명령어로

while(cond) stmt; // stmt while “cond” is true

을 사용할 수 있다.

만약

while(1) ...

의 문장은 1 이 항상 참이므로 무한반복하게 되므로 실행문에서 밖으로 빠져나오는 명령이 필요할 것이다.

한편

while(0) ...

의 경우에는 while 문 전체를 무시하고 건너뛰게 된다.

#> i = 0; i = 0

#> while( ++i < 5 ) i; i = 1 i = 2 i = 3 i = 4

위의 경우에서 ++i 는 i < 5 를 실행하기 전에 먼저 1 을 증가시키므로 증가된 i 값이 4 일 때까지 반복된다.

22

Page 23: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

그러나, 아래와 같이 i++를 사용하게 되면 i < 5 가 참이 되는 i = 4 의 경우에 반복문이 실행된다. 그런데 i < 5 가 참,거짓을 판단하고 난 다음에 i 값을 1만큼 증가시키므로 출력되는 i 는 5 까지 반복된다.

#> i = 0; i = 0

#> while( i++ < 5 ) i; i = 1 i = 2 i = 3 i = 4 i = 5

순환문 do-while

while(cond) 순환문은 조건이 참일 때만 실행되므로 while(0) 의 경우 전혀 실행되지 않는다. 그러나 do-while 의 경우는 최소한 1 번은 실행이 보장되는 순환문이다. 다시 말해서

do { i=1 } while(0) ;

의 경우에도 최소한 do 내부의 명령이 1 번은 실행된다.

#> a = 5; a = 5

#> do { a = a*a; } while( 0 ); a = 25

단순한 for 순환문

마치 배열문처럼 보이는 명령어

for[number] stmt; // stmt “number” times

23

Page 24: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

을 이용하여 단순히 여러 번 순환문을 실행한다.

#> s = 0; s = 0

#> for[10] s += 1; s = 1 s = 2 s = 3 s = 4 s = 5 s = 6 s = 7 s = 8 s = 9 s = 10

인덱스를 가지는 for 순환문

등차수열로 주어지는 인덱스에 대한 순환문은

for.n(a,b,h=1) stmt1; // stmt1 for n=a,a+h,a+2h,…

으로 작성한다. 위에서 h=1 이라는 의미는 h 의 값이 생략될 때는 h=1 로 지정하여 자동적으로 실행한다는 뜻이다.

#> for.k(3,7) k^2; ans = 9 ans = 16 ans = 25 ans = 36 ans = 49

#> for.j(12,3,-2) j; j = 12 j = 10 j = 8 j = 6 j = 4

24

Page 25: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

C언어에서의 for 순환문

C언어에서 정의되는 순환문은 m#math 에서도 그대로 사용된다.

for(init; cond; expr) stmt2; // the same as C-language

위에서 init 은 초기화(initialization), expr 은 수식(expression)을 의미한다. 순환문은 cond 이 참이 동안에 반복되며 거짓으로 판단되며 for 문을 바로 빠져나간다. 따라서

#> for(i=1; 0; i+=1) i=3;

#> i i = 1

의 경우에는 i=1 인 초기화를 실행하고 0 이 거짓이므로 for 문을 빠져나간다. m#math 에서 for 문의 초기화는 출력하지 i 값을 출력하기 위하여 추가적으로 명령어를 실행한 것에 주목한다.

일반적인 사용법은 다음과 같다.

#> for(j=12; j>=3; j-=2 ) j; j = 12 j = 10 j = 8 j = 6 j = 4

break

break; // is used to exit from ‘while’, ‘for’, ‘switch’

순환문이나 선택문에서 빠져나오는 명령어로 복합문 { } 에서 닫힘괄호 } 로 이동하는 것으로 생각하면 된다.

#> i = 0;

25

Page 26: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

i = 0

#> while(1) { i; if( ++i > 5 ) break; } /*here*/ i = 0 i = 1 i = 2 i = 3 i = 4 i = 5

continue

continue; // is used to move to the starting position

순환문의 처음 위치로 이동하는 명령으로 복합문 { }에서 닫힘괄호 } 의 바로 앞으로 이동한 것으로 생각하면 된다..

#> i = 0; i = 0

#> while( ++i < 5 ) { if( i == 3 ) continue; i; /*here*/ } i = 1 i = 2 i = 4

goto

goto destination; … destination: stmt// destination must start with a string

콜론(:)으로 끝나는 목적지로 이동시키는 명령어이다. 아래에서 이동위치는 "seoul" 로 지정되고, seoul: 으로 시작하는 명령라인으로 이동한다.

#> a = 1; goto seoul; b = 2; seoul: c = 3;

a = 1 c = 3

26

Page 27: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

위의 결과에서 goto 문에 의해 바로 seoul 로 이동하였으므로 b = 2 는 실행되지 않는다.

switch

switch(n) { case n1: stmt: break; case n2: stmt; default: stmt; // optional}

switch 명령의 인수는 항상 정수형 (문자를 포함)이어야 하며, 마찬가지로 case 의 대상도 항상 정수형이다.

break 로 종료하지 않으면 자동적으로 다음 case 로 계속 명령이 진행되는 점에 주의하여야 한다.

#> (a,b,c) = (0,0,0) a = 0 b = 0 c = 0

#> n = 4; n = 4

위의 값을 가지고 아래의 명령을 수행해보자.

switch(n) { case 1: a = 10; break; default: c = 5; // continue to the next line case 2: b = 20; break; case 3: c = 100; } c = 5 b = 20

결과는 default, case 2 의 명령을 모두 수행하고 break 에 의해 빠져나온 것을 알 수 있다. 결국 최종값은

27

Page 28: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

#> a; b; c; a = 0 b = 20 c = 5

함수 선언

double f(x) = x ;double f(double x) = x ;double f(double x) { return x; } // standard C grammar

#> double fn(x) = |x|*sin(x) ;

간단한 함수 선언은 = 을 이용하여 수식을 적는다. 함수이름을 치면

#> fn ;double fn(x)

와 같은 어떤 형태의 함수인지 알려준다.

#> fn(3) ;ans = 0.42336002

#> fn'(3) ; // derivativeans = -2.8288575

#> fn''(3) ; // 2nd-order derivativeans = -2.4033449

#> fn~(0,3); // integration over (0,3)ans = 3.1110975

#> fn++( [1,2,3] ) ; // upgrade for matrixans = [ 0.841471 1.81859 0.42336 ]

위의 경우처럼 함수를 업그레이드 하면 실수형이 아니더라도 행렬을 인수로 받아들여서 element-by-element 로 연산을 수행할 수 있다.

28

Page 29: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

함수의 인수

double f(a,b,c)double f(double a,b,c)double f(double a, double c, double c) // C language

Repeating arguments of same types can be declared by a leading declaration

반복되는 함수의 인수는 형선언 명령을 한 번만 해도 된다. 중간에 데이터 형이 바뀌면 새로운 형선언을 넣으면 된다. 예를 들어

double a,b,c, matrix A,B, vertex u,v

double a, double b, double c, matrix A, matrix B, vertex u, vertex v

을 입력한 것과 동일하다.

함수의 업그레이드

행렬을 리턴하고 실수를 인수로 가지는 함수도 역시 업그레이드 할 수 있다.

#> matrix ut(double x) = [ x; 1; x^2 ];

#> ut( 3 );ans =[ 3 ][ 1 ][ 9 ]

#> ut++( [ 3,4,5 ] );ans =[ 3 4 5 ][ 1 1 1 ][ 9 16 25 ]

29

Page 30: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

#> ut++( [ 3,4; 5,6 ] );ans =[ 3 4 ][ 5 6 ][ 1 1 ][ 1 1 ][ 9 16 ][ 25 36 ]

위의 기능은 행렬의 Kronecker 곱의 개념을 확장한 것으로 보면 된다.

함수의 인수복사

기본적으로 함수의 인수는 복사되어 전달되므로 원본은 바뀌지 않는다.

void swap1(x,y) { t = x; x = y; y = t; }

#> x = 3; y = 5;x = 3y = 5#> swap1(x,y); x; y;x = 3y = 5// Nothing happens to x and y.

함수의 인수참조

함수의 인수에 원본을 전달하여 원본의 값을 바꾸고 싶으면 변수 앞에 & 를 붙이면 된다.

void swap2(&x,&y) { t = x; x = y; y = t; }

#> x = 3; y = 5;x = 3y = 5#> swap2(x,y); x; y;

30

Page 31: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

x = 5y = 3// Note that x and y are changed.

함수의 배열인수

함수의 인수가 배열이면 * 를 앞에 붙여서 배열의 이름임을 알려준다. 이때 배열은 항상 원본을 전달하므로 원본값이 바뀐다.

void array(matrix *A){ A[0] = .zeros(3); A[2] = [ 1,2,3,4; 5,6,7,8 ];}

#> matrix An[4]; array(An); An;An = matrix [4][0] =[ 0 0 0 ][ 0 0 0 ][ 0 0 0 ][1] =[ undefined ][2] =[ 1 2 3 4 ][ 5 6 7 8 ][3] =[ undefined ]

함수의 자신호출(재귀함수)

함수가 자신을 호출하는 경우에는 반드시 한 군데의 출구가 있어야 한다. 그렇지 않으면 무한호출이 되어 프로그램이 종료할 수 없다.

%> factorial functiondouble fac(n) { if( n == 1 ) return 1; return n*fac(n-1);

31

Page 32: Web view · 2013-03-23무게를 나타내는 3.4 파운드(pound 또는 줄여서 lb)라는 영미단위계 (British Unit)를 MKS 단위로 나타내면 1.54221 kg 이다. 이러한

[103] 001 m#math practice by www.msharpmath.com

}#> fac(5);ans = 120

함수의 인수의 자동지정

함수의 인수가 여러 개일 때 지정되지 않는 인수값을 자동으로 지정할 수 있다. 이때 지정되는 수식에는 반드시 앞에서 선언된 인수만을 사용해야 한다.

#> double volume(a, b=a, c=a+b ) = a*b*c;

#> volume(3);ans = 54

#> volume(3,4);ans = 84

#> volume(3,4,5);ans = 60

//----------------------------------------------------------------------// end of file//----------------------------------------------------------------------

32