2011-04-23 95 views
1

嘿, 所以我有一個楓分支方法,我必須將其轉換爲C++。我試圖根據楓論壇上的代碼生成幫助轉換它,但它一直拋出錯誤。我將不勝感激這方面的一些幫助。 謝謝,從楓到C++的翻譯

這裏是楓

代碼

使用二分法解決以下數學問題: 一個。方程的最小正根

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

與delta = 10^-5和EPS = 10^-6

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

從圖表上方我們可以得出結論,給定的方程已經最小的正實數根位於0.0之間

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)的準確性得到它們的值

警告,更名COORDS已經被重新定義

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

你可能想發佈'轉變成C++代碼和錯誤。人們可能會發現幫助更容易。 – forsvarir 2011-04-23 19:43:41

+0

evalf(subs(x = c,feq))''feq'是一個函數對象,這看起來特別不平凡。 – Potatoswatter 2011-04-23 20:03:36

+0

沒問題,所以根據代碼生成論壇上楓葉 http://www.maplesoft.com/support/help/Maple/view.aspx?path=CodeGeneration 我得到的唯一錯誤是過早輸入和呼叫,我使它轉換爲例如C(功能) – blackzodiac 2011-04-23 20:12:59

回答

1

你不會需要一個subs電話,如果你把你的feq的過程。

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的表達,可以隨時使用unapply命令把它變成操作員(一種程序,但也可以是代碼生成)。

例如,我也可以通過以下方式創建程序f。 (注意,這些中的一個產生一個缺省10位近似裨在生成的C代碼以及其他的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);