首页 文章

从Maple到C的翻译

提问于
浏览
1

嘿,所以我有一个枫树程序,它做二分法,我必须将它转换为C.我尝试根据maple论坛上的代码生成帮助说明转换它,但它一直抛出错误 . 我会很感激这方面的一些帮助 . 谢谢,

这是枫的代码


使用二分法解决以下数学问题:a . 方程的最小正根

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):

警告,名称更改coords已重新定义

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

1 回答

  • 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);
    

相关问题