gpt4 book ai didi

c++ - 从 Maple 到 C++ 的翻译

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:45 24 4
gpt4 key购买 nike

嘿,所以我有一个执行二分法的 maple 程序,我必须将它转换为 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):

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

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

最佳答案

如果您将 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 代码中生成 Pi 的默认 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);

关于c++ - 从 Maple 到 C++ 的翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5766421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com