2011-04-23 2 views
1

안녕하세요, 그래서 저는 이분법을 사용하는 메이플 프로그램을 가지고 있으며 이것을 C++로 변환해야합니다. 나는 메이플 포럼에서 코드 생성에 도움이되는 내용에 따라 변환을 시도했지만 오류는 계속 발생했다. 나는 이것에 약간의 도움을 주시면 감사하겠습니다. 감사합니다,Maple에서 C++ 로의 번역

여기에 단풍

의 코드

있는 다음과 같은 수학 문제를 해결하기 위해 이분법을 사용 을 수행합니다. 10 -6 우리는 주어진 식을 결론 지을 수 위 그래프로부터

plot(f(x),x=.05..10.0); 

는 작은 양의 실수 루트 0.0 사이에있다^델타 = 10^-5 EPS와

f(x):=evalf(1/x-evalf(Pi)*cos(evalf(Pi)*x)); 

= 방정식의 작은 양의 루트

Bisect:=proc(funct_equation,ai,bi,Mi,epsfi,deltaxi) local k,M,a,b,u,v,w,c,e,epsf,deltax,feq, notsolved: M:=Mi: feq:=funct_equation: a:=ai: b:=bi: epsf:=epsfi: deltax:=deltaxi: notsolved:=true: u:=evalf(subs(x=a,feq)): v:=evalf(subs(x=b,feq)): printf("a=%+9.6f %+12.6e\nb=%+9.6f %+12.6e\n\n",a,u,b,v); e:=b-a; if (sign(u)<>sign(v)) then printf(" n  x   f\n"); for k from 1 by 1 while (k<M and notsolved) do: 
    e:=0.5*e; 
    c:=a+e; 
    w:=evalf(subs(x=c,feq)): 
    printf("%2d %+9.6f %+12.6e\n",k,c,w); 
    if (abs(e)<deltax or abs(w)<epsf) then 
     notsolved:=false: 
    else 
     if (sign(w) <> sign(u)) then 
     b:=c: v:=w: 
     else 
     a:=c: u:=w: 
     fi: 
    fi: od: printf("Root = %+9.6f function = %+12.6e\n",0.5*(a+b),evalf(subs(x=0.5*(a+b),feq))); fi: end: with(plots): 
: 2.0

정확성 우리가 루트 분리 간격 (0.01,2.0을) 이분법를 호출 할 필요와 그 값을 얻으려면

경고, 이름 변경 좌표 당신은 필요가 없습니다

Bisect(f(x),0.01,2.0,30,1.0e-6,1.0e-5): 
+3

당신은을 게시 할 수있는 코드 'C++로 변환'과 오류. 사람들이 쉽게 찾을 수 있습니다. – forsvarir

+0

'evalf (subs (x = c, feq))''feq'가 함수 객체 인 행은 특히보기 드문 사항입니다. – Potatoswatter

+0

ok 그래서 메이플 코드 생성 포럼에 따라 http://www.maplesoft.com/support/help/Maple/view.aspx?path=CodeGeneration 오류는 조기 입력과 예를 들어 C로 변환하십시오 (함수) – blackzodiac

답변

1

을 재정의 된 그 subs 전화, 당신은 당신의 feq A와 절차를 계속합니다. unapply 명령을 사용하여 당신이 f에 대한 식으로 시작하는 경우

restart: 
Bisect:=proc(func::procedure,ai,bi,Mi,epsfi,deltaxi) 
local k::integer, 
    M::integer, 
    a,b,u,v, 
    w::float, 
    c,e, 
    epsf::float, 
    deltax, 
    notsolved; 
    M:=Mi: 
    a:=ai: b:=bi: epsf:=epsfi: 
    deltax:=deltaxi: notsolved:=true: 
    u:=func(a); 
    v:=func(b); 
    printf("a=%+9.6f %+12.6e\nb=%+9.6f %+12.6e\n\n",a,u,b,v); 
    e:=b-a; 
    if (sign(u)<>sign(v)) then 
    printf(" n  x   f\n"); 
    for k from 1 by 1 while (k<M and notsolved) do 
     e:=0.5*e; 
     c:=a+e; 
     w:=func(c); 
     printf("%2d %+9.6f %+12.6e\n",k,c,w); 
     if (abs(e)<deltax or abs(w)<epsf) then 
     notsolved:=false: 
     else 
     if (sign(w) <> sign(u)) then 
     b:=c: v:=w: 
     else 
     a:=c: u:=w: 
     fi: 
    fi: 
    od: 
    printf("Root = %+9.6f function = %+12.6e\n",0.5*(a+b),func(0.5*(a+b),feq)); 
fi: 
0.5*(a+b); 
end: 

with(plots): 

f:=subs(Pi=evalf[16](Pi),proc(x::float) 1/x-Pi*cos(Pi*x); end proc); 

Bisect(f,0.01,2.0,30,1.0e-6,1.0e-5); 

f(%); 

CodeGeneration[C](f); 

CodeGeneration[C](Bisect); 

또한, 당신은 항상 조작으로 바꿀 수 있습니다 (절차의 종류,하지만 너무 코드가 생성 될 수있는).

예를 들어 다음과 같은 방법으로 f 절차를 만들 수도 있습니다. (이들 중 하나가 생성 된 C 코드에서 파이에 기본 10 자리 근사치를 생산하고, 다른 16 자리 근사합니다.)

f_expression := 1/x-Pi*cos(Pi*x); 

f:=unapply(f_expression, [x::float]); 

CodeGeneration[C](f); 

f:=subs(Pi=evalf[16](Pi),unapply(f_expression, [x::float])); 

CodeGeneration[C](f);