【发布时间】:2011-04-23 19:34:47
【问题描述】:
嘿, 所以我有一个执行二分法的枫树程序,我必须将它转换为 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 和 2.0 之间
为了获得所需的准确度值,我们使用根隔离区间 (0.01,2.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):
警告,名称更改坐标已重新定义
Bisect(f(x),0.01,2.0,30,1.0e-6,1.0e-5):
【问题讨论】:
-
您可能想要发布“转换为 C++”的代码和错误。人们可能会发现更容易提供帮助。
-
evalf(subs(x=c,feq))中的feq是一个函数对象的行使这看起来特别不平凡。 -
好的,所以根据 maple maplesoft.com/support/help/Maple/view.aspx?path=CodeGeneration 上的代码生成论坛,我得到的唯一错误是过早的输入以及我为转换它而进行的调用,例如 C(function)
-
所以基本上它甚至没有将任何东西转换为 C