윈도우스 폼프로그래밍에서 그래프나 차트를 그리기 위한 콘트롤로 chart 라는 것이 있다. (.net 4.5부터인가 지원하기 시작함) 이것을 이용하면 간단한 그래프를 작성하는데 외부 라이브러리(예를 들어 oxyplot)를 사용할 필요가 없다.


 비주얼 스튜디오로 winForm 프로젝트를 하나 생성하여 도구상자에서 chart를 끌어다가 적당히 위치시킨 후 docking 시킨다.



그러면 chart1이라는 인스턴스가 생성되는데 이것를 이용하여 그래프를 제어할 수 있다.



using System.Windows.Forms.DataVisualization.Charting;
private void Form1_Load(object sender, EventArgs e)
{
 chart1.Series.Clear(); //default series를 삭제한다.
 Series sSin = chart1.Series.Add("sin"); //새로운 series 생성
 sSin.ChartType = SeriesChartType.Line; //그래프 모양을 '선'으로 지정
 //데이터 포인트 저장
 for (double k=0;k<2*Math.PI;k+=0.1)
 {
      sSin.Points.AddXY(k, Math.Sin(k));
 }
}


결과 화면은 다음과 같다.



한 화면에 다수의 그래프를 그릴 수도 있는데 Series 객체만 추가시켜주면 된다.


private void Form1_Load(object sender, EventArgs e)
{
   chart1.Series.Clear(); //default series를 삭제한다.
   Series sSin = chart1.Series.Add("sin"); //새로운 series 생성
   sSin.ChartType = SeriesChartType.Line; //그래프를 '선'으로 지정
   //데이터 포인트 저장
   for (double k=0;k<2*Math.PI;k+=0.1)
   {
       sSin.Points.AddXY(k, Math.Sin(k));
   }
           
   // 같은 화면에 그래프 추가
   Series sCos = chart1.Series.Add("cos"); //새로운 series 생성
   sCos.ChartType = SeriesChartType.Line;
   for (double k = 0; k < 2 * Math.PI; k += 0.1)
   {
       sCos.Points.AddXY(k, Math.Cos(k));
   }
}


그러면 다음과 같이 두개의 그래프가 그려진다.



chart콘트롤은 Series객체가 갱신될 때마다(즉, 데이터 포인트가 추가될때마다) 자동으로 그래프 영역을 갱신시켜 준다.




Posted by 살레시오
,

 C# 6.0은 이전 버전의 메이져 업그레이드가 아니라 사용자 편의성을 높일 자잘한 기능들이 추가되었는데 문자열 보간도 그 중 하나이다. 예를 들어서 문자열의 중간에 변수의 값을 넣고 싶다면 String.Format()함수를 이용하였다.


str = String.Format(“da is {0}.\r\n”, da);


또는 Console.Writeln함수에서도 이런 형식을 입력할 수 있다.


Console.Writeln(“da is {0}.\r\n”, da);


C# 6.0에서는 이것보다 더 간단한 표현식을 제공한다.


str = $“da is {da}.\r\n”;
Console.Writeln($“da is {da}.\r\n”);


위와 같이 문자열 앞에 $를 붙이면 문자열 내부의 {...}안에 변수가 바로 올 수 있다. 이것을 문자열 보간(string interpolation)이라고 하고 컴파일 시에 내부적으로 String.Format() 함수를 이용한 코드로 적절하게 해석이 된다. 이 새로운 문법이 보기에 훨씬 더 간결하다.


 이 방법으로 정렬과 표시 방법도 옵션으로 지정할 수 있다. 예를 들어서 이전에는 다음과 같이 코딩했던 것을

 

for (int ctr = 0; ctr < names.Length; ctr++)
{
 Console.WriteLine("{0,-20} {1,5:N1}", names[ctr], hours[ctr]);
}

유사하게 문자열 앞에 ‘$’를 붙이고 {...} 안에서는 번호(인덱스) 대신 변수명으로 대신하여 사용할 수 있다.


for (int ctr = 0; ctr < names.Length; ctr++)
{
  Console.WriteLine($"{names[ctr],-20} {hours[ctr],5:N1}");
}

여기에서 첫 번째 변수는 20칸 좌정렬이 되고 두 번째 변수는 5칸 우정렬에  N1형식으로 표시된다.



Posted by 살레시오
,

wxMaxima에서는 그래프를 그리는 명령으로 wxplot2d 함수와 wxplot3d 함수가 있는데 각각 2차원 그래프와 3차원 그래프를 그려준다. 이번 절에서는 2차원 그래프를 그리는 함수의 사용법에 대해서 알아보자. 일단 메뉴창에서 이 함수를 선택하면 (Plot > Plot 2d...) 아래와 같은 대화창이 화면에 나타난다.

[그림 1] wxMaxima에서 plot>Plot 2d 메뉴 선택


[그림 2] Plot 2d 메뉴의 정보 입력 창

위에서 부터 차례대로


①도시할 함수(expression)

② x축의 범위

③ y축의 범위

④ 그래프의 정밀도

⑤ 표시형식(format)

⑥ 선택사항

⑦ 그래프를 저장할 화일명 (eps)


들을 입력하게 되어 있다. 일단 처음이니까 [그림 2]와 같이 첫 번째 칸만 채우고 [OK]를 클릭(엔터키를 쳐도 된다)하면 다음과 같은 그래프가 입력창에 나타나게 된다. 결과를 보면 알겠지만 대화창은 단순히 wxplot2d 함수의 파라메터를 결정해서 함수를 호출하는 역할을 한다. 따라서 사용자가 직접 이 함수를 입력해도 동일한 결과가 나타나므로 앞으로는 wxplot2d함수를 직접 입력해 보겠다.



Posted by 살레시오
,

 맥시마에서 수학 함수는 := 기호를 써서 정의한다. 변수에 어떤 값을 대입하는 연산자는 콜론(:)이고 함수를 정의하는 기호는 (:=) 이라는 것에 유의해야 한다.



다음 예제를 고려하자.


.


이것을 맥시마로 풀면 다음과 같다.



 조건명령 if를 이용하여 함수를 정의할 때 구간 별로 다른 규칙을 정의할 수 있다. 예를 들어 다음과 같은 불연속 함수를 고려하자.

이 함수는 다음과 같이 입력할 수 있다.



다음 함수도 유사하게 입력할 수 있다.


이와 같이 맥시마에서 함수를 정의할 경우에는 := 연산자를 사용하며 if 조건문을 이용하여 불연속 함수도 자유롭게 생성할 수 있다.






Posted by 살레시오
,

 맥시마에서 조건 검사를 하는데 if 명령어가 사용된다. 문법은 다음과 같다.


if <조건식> then <expr1> else <expr2>


만약 조건식이 참이면 <expr1>이 실행되고 거짓이면 <expr2>가 실행된다. 조건식을 구성하는데 사용되는 조건 연산자는 다음과 같다.


[표 1] 조건식에 사용되는 연산자들

연산자

의미

비고

a = b, equal(a,b)

같다

관계 연산자

a # b, notequal(a,b)

다르다(≠)

a < b

크다

a > b

작다

a <= b

크거나 같다

a >= b

작거나 같다

and

and

논리 연산자

or

or

not

not


예를 들면 다음과 같다.

변수 a에 %pi 값이 들어있으니 조건은 거짓이 되므로 b:0 이 실행된다. 위의 예제는 다음과 같이 조금 더 간단하게 바꿀 수 있다.


위에서 (if a<%e else 0)가 단일 표현식이며 그 값은 조건에 따라서 1이거나 0이 된다. 따라서 조건에 따라 그 값을 변수 b에 저장시키는 것이다. and연산자를 이용한 예를 들어보면 다음과 같다.


또한 elseif 명령을 이용하여 if문을 중첩하여 쓸 수 있다.


if <조건식1> then <expr1>
elseif <조건식2> then <expr2>
elseif <조건식3> then <expr3>
...
else <exprN>


이 문법에서 만약 <조건식1> 이 참이라면 <expr1>을 수행하고 빠져나간다. <조건식1>이 거짓이고 <조건식2>가 참이라면 <expr2>를 수행한다. <exprN>은 모든 조건이 거짓일 때 수행된다. 다음 예를 보자.

이 예제에서 변수 b에는 2가 대입된다.



Posted by 살레시오
,

 맥시마는 반복 수행을 위한 명령어 for 가 있다. 문법은 다음 표에 정리한 바와 같다.


[표 1] for반복문의 문법


생략 가능

(기본값은 1)

다음 중 택일

(반드시 하나는 있어야 함>


for <변수>:<초기값>

step <증감값>

thru <끝값>

do <수행문>



while <조건식>



unless <조건식>


for <변수> in <list>

do <수행문>


먼저 반복문에서 사용할 변수를 초기화 시켜야 한다. 그 다음에 증감값을 step명령 다음에 지정해 준다. 이 증감값은 생략가능하며 이 경우 기본값인 1로 지정된다.


가장 기본적인 사용법의 예는 다음과 같다. (display함수는 단순히 변수의 값을 화면에 출력하는 함수임)

만약 1부터 100까지의 합을 구하고 싶다면 다음과 같다.

증감값을 정하고 싶다면 step 명령어를 다음과 같이 이용한다.

for문을 이용하여 x5+x4+x3+x2+x+1을 생성하면 다음과 같다.

같은 명령을 thru 대신 while을 이용하면 다음과 같다.


또 다른 예로서 리스트 [0, 1, 2, 3, … , 29, 30]를 생성하려면 다음과 같이 하면 된다. 다음 명령을 입력한 후에 그 결과를 확인해 보자. (/*~*/사이의 주석문은 입력할 필요가 없다.)


똑같은 명령을 unless를 이용하여 작성하면 다음과 같다.

이러한 for문을 이용하여 다양한 반복 작업과 많은 요소를 갖는 객체(리스트나 다항식 등)를 생성할 수 있다.





Posted by 살레시오
,

 이전 포스트들에서 설명한 계산식, 변수 대입, 수식 등등이 모두 Maxima의 표현식(expression)이다. 표현식은 그 자체로서 객체를 이루며 또는 정해진 동작을 수행하여 결과 값을 반환해 주기도 한다.



위의 두 예는 동일한 동작을 수행한다. 먼저 x에 2+i 라는 복소수를 대입한 후 그 값을 다시 a변수에 저장한다. 맥시마에서는 표현식을 괄호 ( )로 묶을 수 있으며 단일 표현식에서는 보통 괄호를 생략한다. 따라서 (x:2+%i)는 하나의 표현식이며 그 값은 2+i 라는 값을 가진다. 표현식이 값을 가지는 것이다. 따라서 a변수에 (x:2+%i)의 값인 2+i 가 대입되게 되는 것이다.



표현식이 하나라면 보통 괄호를 생략하지만 여러 개의 표현식을 묶을 때는 괄호를 사용하고 각각의 표현식은 콤마(,)로 구분한다.



위의 예를 보면 첫 번째 줄에서 네 개의 표현식이 괄호로 묶여있다. 이 명령을 내리면 각각의 표현식이 하나씩 실행이 된다. 즉 a변수에 cos2(x)+sin(x)수식이 입력되고 b변수에는 3/sqrt(2)값이, 변수 c에는 3값이 저장된다. 그런데 결과를 보면 (%o1) 3이 나온다. 즉 (...) 안의 표현식은 몇 개가 되었든지 하나의 값을 가지는데 제일 마지막 표현식의 값을 가지며 그 결과가 찍혔다는 것을 알 수 있다. 따라서 다음과 같은 대입이 가능하다.



위의 예를 보면 x:( ... ) 명령어에서 ( ) 안에 두개의 표현식이 있다. 각각은 실행되며 전체 표현식의 값은 마지막 표현식의 값이 되므로 그 값이 변수 x에 저장된다. 따라서 이 예제를 실행시키면 변수 a, b, x 세 개에 각각 값이 저장된다.



  이제 아래 예들의 동작을 구분해 보자.



첫 번째 예는 세 개의 표현식 각각을 독립적으로 실행시킨 것이다. 따라서 그 결과 값도 각각 독립적으로 저장된다. (%o1, %o2, %o3) 두 번째 예는 첫 번째 것과 동작은 똑같지만 결과값은 하나만 생성된다.(%o4) 괄호로 묶여서 전체가 하나의 표현식이고 그 값은 마지막 표현식의 그것이기 때문이다.




Posted by 살레시오
,

 리스트(list)는 맥시마의 기본 자료형 중 하나로서 다양한 표현식을 하나의 집합으로 묶어놓은 것이다. 기본적인 정의는 대괄호 [ ] 를 이용하며 각각의 요소는 콤마(,)로 구분한다. (공백 문자가 아님에 주의하자.)



위의 예는 lsA라는 변수에 리스트 [1, 2, 7, x+y]를 대입한 것이다. 리스트명은 임의의 식별자가 될 수 있다. 만약 x나 y가 어떤 값을 갖는 변수라면 그 값이 대신 들어간다. 그렇지 않다면 그냥 문자 상수로 인식된다.


 리스트 내부의 하나의 요소를 참조할 때에는 리스트명 뒤에 역시 대괄호를 이용하여 인덱스를 지정한다.



리스트의 요소로는 표현식(상수, 변수, 수학 함수 등등)과 리스트 자체도 리스트의 요소가 될 수 있다. 다음 예를 보자.



lsA는 네 개의 요소를 갖는 리스트인데 네 번째 요소는 리스트이다. 따라서 lsA[4]는 리스트 [a,b,c]인 것이다. 리스트 안의 리스트를 인덱싱하기 위해서는 위의 마지막 예와 같이 하면 된다.


 만약 값을 가진 변수를 이용하여 리스트를 정의한 후에 사용된 변수의 값을 바꾸면 어떻게 될까? 변경된 값이 리스트에 영향을 미칠까? 다음 예를 살펴보자.



만약 위와 같이 변수 a, b값을 이용하여 lsA를 정의했다면 정의된 그 시점의 a, b값이 lsA에 사용되는 것이지 변수 a, b 자체를 사용한 것은 아니다. 따라서 이후에 변수 a, b값을 바꾸는 것은 lsA에 아무런 영향을 미치지 않는다는 사실에 유의해야 한다.



그리고 리스트와 스칼라와의 산술 연산은 리스트 내의 모든 요소에 적용된다.



그리고 리스트끼리의 산술연산은 크기가 똑같아야 성립된다.



 리스트를 다루는 여러 함수 중에 많이 사용되는 몇 개만 소개하면 다음과 같다. 먼저 append() 함수는 두개의 리스트를 입력받아서 그 두개를 붙인 리스트를 생성한다.



리스트의 크기를 구하는 함수로서 length() 함수가 있다.



그리고 첫 번째 요소와 마지막 요소를 반환하는 함수는 각각 first(), last() 함수이다.



[표 1] 리스트 관련 함수 정리

기호

의미

append(lsA, lsB)

lsA와 lsB를 붙여서 새로운 리스트 생성

length(lsA)

lsA의 요소의 개수를 반환

first(lsA)

lsA의 첫 번째 요소

last(lsA)

lsA의 마지막 요소




Posted by 살레시오
,

 맥시마를 처음 시작할 때 잘못 쓰기 쉬운 기호 중 하나가 바로 =이다. 보통 다른 프로그래밍 언어에서는 대입 연산자(우항 값을 좌항에 저장하는)로 사용되므로 이것에 익숙해서 여기에서도 당연히 대입 연산자일거라고 생각하기 때문이다. 그런데 맥시마의 대입 연산자는 : , :=, :: , ::= 이 네 가지이다.


맥시마에서 =는

① 등식(eqation)을 만들거나

② ‘같다’를 판변하는 비교 연산자로 사용되는 기호이다.


아래 예를 보자


첫 번째에서 x=2라고 입력하면 변수 x에 2를 입력한 것이 아니다. 그냥 (x=2)라는 등식을 입력한 것이다. 두 번째 예에서는 변수 a에 (x=2)라는 등식 자체를 입력한 것이다. Maxima에서 변수는 상수뿐만 아니라 뒤에 나오겠지만 표현식(expression)도 저장할 수 있다. 아래의 예는 변수 b에 x2-2x+1=0 이라는 방정식 자체를 입력한 것이다.


그리고 ‘=’기호는 조건 검사문 if 문과 뒤에오는 조건식에서 ‘같다’를 판별하는 논리 연산자로 쓰인다.

위에서 if 문 뒤의 (x = %pi) 에서 =는 변수 x값이 π와 같은지를 검사하는 비교 연산자이다. 이 논리식이 참이기 때문에 변수 a에 1값이 대입되었다.

 비교 연산자로 쓰이는 <, >, <=, >=도 비교 연산자 뿐만 아니라 부등식(inequality)를 만드는 데에 사용된다.

위의 첫 번째 입력은 c라는 변수에 2y+1<0 이라는 부등식을 대입한 것이다. 두 번째 입력에서 (d>2)는 if문 뒤의 조건식이다. 이것이 참이므로 e변수에 true값이 저장된다.



Posted by 살레시오
,

 식별자(identifier)라는 것은 이름을 말하는데 이 식별자를 변수나 함수의 이름으로 사용할 수 있다. Maxima에서 식별자를 만드는 데 사용될 수 있는 구성 요소는 아래와 같다.

  • 알파벳 대소문자 (A~Z, a~z)

  • 숫자 (0~9)

  • _ (under bar)

  • %

  • \(백슬래쉬)+(특수문자)

 다른 프로그래밍 언어와 달리 맥시마는 식별자를 만들 때 %나 \#, \$와 같은 특수문자 조합도 사용할 수 있다. 또한 식별자를 만들 때 주의할 점은 숫자로 시작하면 안 된다는 것이며 대소문자를 구별한다는 것이다. 올바른 식별자의 예는 다음과 같다.

mA, aa, AA, lstB, _abc, %number, \@myVar, is_this_\#var

 변수에 어떤 수치 값을 대입하려면 콜론(:)을 사용하며 등호(=)가 아님에 유의해야 한다. 처음에 wxMaxima를 사용하기 시작할 때 가장 하기 쉬운 실수 중에 하나가 바로 변수 값을 대입할 때 콜론(:)대신 등호(=)를 사용하는 것이다.



이제 입력과 출력 앞에 붙은 (%i53), (%o60)와 같은 표시를 주의 깊게 살펴보면 이것들이 식별자라는 것을 알 수 있다. 맥시마에서 새로운 명령을 입력하거나 결과가 산출될 때 그것들은 이 변수에 자동으로 저장이 된다. 따라서 차후에 이 변수를 가지고 과거의 입력이나 출력을 참조할 수 있으며 그것들도 일반 변수와 같이 사용할 수 있다.


 기호 _ 는 바로 직전의 입력, %는 바로 직전의 출력이다. 다음 예를 따라서 해보고 결과를 확인해 보자.



그리고 현재 정의된 모든 변수를 확인하려면 values 라는 명령어를 입력하면 된다. 특정한 변수를 삭제하려면 kill() 함수를, 정의된 모든 변수를 제거하려면 kill(all) 명령을 내리면 된다.



 변수명으로 써서는 안 되는 예약어들은 다음과 같은 것들이 있다. (매뉴얼 pp.87)


if, then, else, elseif, and, or, unless,
integrate, next, from, diff, in, at, limit, sum, for, do,
product, while, thru, step



Posted by 살레시오
,