01. 서론

 

Cap 2017-12-04 21-41-17-322.png

[Fig. 1] 임팩트빔의 단면형상에 따른 강도 최적화 수행과정

 

이전 게시글 "[lsopt] LS-OPT를 이용한 [Perl] Script 돌리기"에서 언급했듯이 원래는 MATLAB 스크립트를 LS-OPT로 돌리는 것이 목적이였다.

 

왜 LS-OPT를 써야 했는지 썰을 풀자면... Impact beam 단면형상에 따른 강도 최적화 연구 과정에서 실험계획법 분석이 망했기 때문이다.

(Minitab DOE로 실험계획표 만들고, [Fig. 1]을 MATLAB으로 다 짜고 경우의 수 만큼 *.k 파일 만들고, 해석 까지 다 했는데 분석 결과가 쓰래기로 나왔다.)

 

실험계획법까지 내가 일일이 다 건드는 것은 사치구나. LS-OPT로 돌리는게 낫겠다. 라고 생각했다. 실제로 그게 편할 것 같고...

그리고 이전의 Perl을 성공했을 때, '아 다했다. 크리스마스 이브에 고생한 보람이 있네.'라고 생각했었지.

그런데 좀 심각한 문제가 있었다.

 

02. 문제정의

 

Perl 언어를 MATLAB언어로 옮기면 아래와 같다.

 

 

function iReturn = mfFunction()

    x = <<X:10>>;
    y = <<Y:10>>;

    f = sin(4*x) - 2*x + x^2 + sin(4*y) - 2*y + y^2;

    fFile = fopen('out.txt', 'w+');
    fprintf(fFile, '%f \rn', f);
    % fprintf(fFile, '%f', f);

    fclose(fFile);

    % fprintf('N o r m a l
\n');
    system('echo N o r m a l');
    exit
    
    iReturn = 0;
end

 

 

 

 

제 1행, MATLAB 함수 표현이다. 이 함수의 이름은 mfFunction이다. Perl 예제처럼 파일이름과 함수 이름을 function으로 하면 matlab 문법 오류가 난다.

제 3행, 변수 선언이다. int, double같은 자료형을 선언하지 않는다. 그러나 <<X:10>>의 LS-OPT 변수 선언 방식은 지켰다.

제 6행, f는 벼수다. 그 오른쪽으로는 x와 y를 이용한 계산식이 존재한다.

제 8행, out.txt 파일을 열고 핸들을 fFile 변수에 넣는다.

제 9행, f 변수 값을 out.txt에 넣는다.

제 12행, fFile 핸들을 이용하여 파일 스트림을 닫는다.

제 15행, cmd 명령창에 N o r m a l을 출력시킨다.

제 16행, MATLAB을 종료한다.

제 18행, 함수의 반환값을 지정한다. (사실 의미가 없는 행이다.)

제 19행, function 키워드의 마무리 키워드 end.

 

그런데 Perl 세팅 파일에서 Package name을 MATLAB으로 설정하고, 

 

Command : matlab -nodesktop -nosplash -wait -r

Input FILE : mfFunction

 

으로 설정했더니 자꾸 에러가 난다. 

반복 검증과정에서 관리자 권한 실행의 문제도 있었음을 확인했다.

 

2017-12-26 (12).png

[Fig. 2] lsopt.lsopt 모습 (Download : LSOPT_MATLAB2.zip)7)

 

2017-12-26.png 

[Fig. 3] Stage 모습

 

2017-12-26 (11).png

[Fig. 4] Response 모습

 

[Fig. 3] 및 [Fig. 4]을 보면 알 수 있듯이 달라진 것은 크게 없다.

그래서 Stage를 Matlab type으로 변경해보았다.

 

Cap 2017-12-26 04-48-38-763.png

[Fig. 5] Matlab type stage (Download : LSOPTMATLAB3.zip)7)

 

그러나 문제는 해결되지 않았다.

잠자는 시간 포함 30시간을 붙들고 연구해본 결과,

실험계획법이 실행되며 내부적으로 만들어진 *.m파일을 읽지 못하는 문제라는 것을 알게 되었다.

 

그래서 matlab 경로를 강제로 할당하는 방법이라던가 

matlab 재설치, ls-opt 재설치, main컴퓨터 laptop컴퓨터 sub.컴퓨터 등등에서 실행해보기 라던가 진짜 별의 별 쇼를 다했다.

실제로 matlab answer 사이트에 있는 질문자도 이 점을 질문했던 것 같다.

진짜 앵간하면 크리스마스 지나가기 전까지 원인이라도 알고 싶었는데, 그것이 쉽지 않았다.

 

03. 1차 해결

 

KOSTECH 기술지원팀에 메일을 날리기 직전, LS-OPT Manual8)에는 뭔가 있지 않을까 하다가 아래의 코드를 발견했다. 

(이 코드를 30시간 뒤에나 확인하다니!!! ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ)

 

 

% Definition of variables x1 and x2
    x1 = input('x1-');
    x2 = input('x2:');
% Computation of response(s) and histories
    s = x1+x2;
    h = [0 s;1 s+1;2 s+4;3 s+9];
% Write responses and histories to MatlabOutput file
    fid = fopen('MatlabOutput','w');
    fprintf(fid,'#
\n');
    fprintf('[1] : #
\n');
    fprintf(fid,'RESPONSES
\n');
% response 1
    fprintf(fid,'%d, %s, %fn',0,'s',s);
    fprintf(fid,'END
\n');
    fprintf(fid,'#
\n');
% history 1
    t=1:size(h,1);
    fprintf(fid,'HISTORY 99: h
\n');
    for i=1:size(h,1)
        fprintf(fid,'%f, %f
\n',t(i),h(i));
    end
    fprintf(fid,'END
\n');fprintf(fid,'#\n');
    ChkClose=fclose(fid);
% Write Normal termination status
    diary matstatus;
    disp('N o r m a l t e r m i n a t i o n');
    diary off
    catch
    % Write error termination status
        diary matstatus;
        disp('E r r o r t e r m i n a t i o n');
        diary off;
    end
% exit
     exit

 

그런데 [Code 2]의 스크립트를 그대로 실행시키면 100% 에러가 난다.

일단 matlab에서... x1과 x2의 변수를 받아오는 것도 이상하고, catch 키워드 자체가 문법오류이기 때문이다.

Matlab 실행을 보고 싶다면 [Code 3]과 같이 수정해야 한다.

수정된 부분은 제 2~3행, catch~마지막 행이다.

 

% Definition of variables x1 and x2
    x1 = 3; % input('x1-');
    x2 = 3; % input('x2:');
% Computation of response(s) and histories
    s = x1+x2;
    h = [0 s;1 s+1;2 s+4;3 s+9];
% Write responses and histories to MatlabOutput file
    fid = fopen('MatlabOutput','w');
    fprintf(fid,'#\n');
    fprintf(fid,'RESPONSES\n');
% response 1
    fprintf(fid,'%d, %s, %f\n',0,'s',s);
    fprintf(fid,'END\n');
    fprintf(fid,'#\n');
% history 1
    t=1:size(h,1);
    fprintf(fid,'HISTORY 99: h\n');
    for i=1:size(h,1)
        fprintf(fid,'%f, %f\n',t(i),h(i));
    end
    fprintf(fid,'END\n');fprintf(fid,'#\n');
    ChkClose=fclose(fid);
% Write Normal termination status
    diary matstatus;
    disp('N o r m a l t e r m i n a t i o n');
    diary off
    % catch
    % % Write error termination status
    %     diary matstatus;
    %     disp('E r r o r t e r m i n a t i o n');
    %     diary off;
    % end
% exit
    % exit

 

 

Cap 2017-12-26 04-56-08-922.png

[Fig. 6] mfFunction.m 파일을 이용한 [Code 3]에 대한 MATLAB 결과 보기

 

[Code 3]에 의한 결과 파일 MatlabOutput가 있어야 다음단계를 진행할 수 있다.

귀찮더라도 꼭 한번 실행해보기를 바란다.

 

LS-OPT용으로 만든 스크립트는 아래 [Code 4]와 같다.

 

 

% Definition of variables x1 and x2
    x1 = input('x1-');
    x2 = input('x2:');
% Computation of response(s) and histories
    s = x1+x2;
    h = [0 s;1 s+1;2 s+4;3 s+9];
% Write responses and histories to MatlabOutput file
    fid = fopen('MatlabOutput','w');
    fprintf(fid,'#
\n');
    fprintf(fid,'RESPONSES
\n');
% response 1
    fprintf(fid,'%d, %s, %fn',0,'s',s);
    fprintf(fid,'END
\n');
    fprintf(fid,'#
\n');
% history 1
    t=1:size(h,1);
    fprintf(fid,'HISTORY 99: h
\n');
    for i=1:size(h,1)
        fprintf(fid,'%f, %f
\n',t(i),h(i));
    end
    fprintf(fid,'END
\n');fprintf(fid,'#\n');
    ChkClose=fclose(fid);
% Write Normal termination status
    diary matstatus;
    disp('N o r m a l t e r m i n a t i o n');
    diary off
    % catch
    % % Write error termination status
    %     diary matstatus;
    %     disp('E r r o r t e r m i n a t i o n');
    %     diary off;
    % end
% exit
    exit

 

 

이를 바탕으로 아래와 같이 lsopt.lsopt 파일을 설정할 수 있다.

 

2017-12-26 (14).png

[Fig. 7] lsopt.lsopt 파일 모습 (Download : LSOPTMATLAB4.zip)9)

 

2017-12-26 (15).png

[Fig. 8] stage 모습

 

stage 모습을 보면 MatlabOutput을 지정하게 되어있다.

멀쩡히 잘 실행되는 mfFunction.m가 없다면 영영 구할 수 없는 파일이다.

 

2017-12-26 (16).png

[Fig. 9] stage의 history 모습

 

2017-12-26 (18).png 

[Fig. 10] stage의 response 모습

 

2017-12-26 (19).png

[Fig. 11] setup 모습

 

2017-12-26 (20).png 

[Fig. 12] sampling 모습

 

04. 실행

 

Cap 2017-12-26 00-21-54-023.png

[Fig. 13] 실행화면... 너무 감동적이라 게시한다.

 

05. 결과

 

결과는 사실 별거 없다.

그래서 결과를 생략한다.

 

Reference

 

[1] Problem description, LS-OPT Support

[2] Solution with LS-OPT, LS-OPT Support

  - Download :  optimierung_2variables_for_win.zip

  - Complete : Original_file.zip, 2017.12.25, 신동석

[3] Adwait, "Using Matlab as a solver in LS-OPT", MATLAB AnswersTM, 2015

[4] Gabor Szabo, "펄 설치하고 사용하기"

[5] DWIM Perrl for Windows

  - Download : dwimperl-5.14.2.1-v7-32bit.exe-x

[7] Perl 기반 MATLAB Source code
  - Download : LSOPT_MATLAB2.zip
  - Download : LSOPTMATLAB3.zip
[8] LS-OPT Manual
  - Download : lsopt_52_manual.pdf
[9] Manual 기반 LSOPT Script
  - Download : LSOPTMATLAB4.zip