【问题标题】:Translation from Maple to C++从 Maple 到 C++ 的翻译
【发布时间】: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

标签: c++ maple


【解决方案1】:

如果您将feq 保留为一个过程,您将不需要subs 调用。

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。 (请注意,其中一个会在生成的 C 代码中生成默认的 10 位近似值 Pi,而另一个会生成 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);

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2018-09-16
    • 2019-10-07
    • 1970-01-01
    • 2021-10-24
    • 2019-05-01
    • 2016-10-03
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多