这个 Matlab 代码的 Maple 翻译是啥?
Posted
技术标签:
【中文标题】这个 Matlab 代码的 Maple 翻译是啥?【英文标题】:what is the Maple translation for this Matlab code?这个 Matlab 代码的 Maple 翻译是什么? 【发布时间】:2021-10-24 03:26:28 【问题描述】:uu = polyval(polyfit(x,u,N),xx); % interpolate grid data
上面的代码是用 Matlab 编写的。这个语句在 Maple 中怎么写?
【问题讨论】:
Stack Overflow 不是代码编写服务。请阅读How to Ask 和what's on-topic。尝试后,您需要提出一个具体问题 【参考方案1】:您没有显示使用x
、u
或xx
的示例数据。所以我会补上一些。
以下生成P3
,它可以按元素应用于向量xx
。它在xx
的每个点处插值N-1 次多项式。
restart;
Digits:=15:
N:=20:
(a,b):=0,2*Pi:
x:=Vector([seq(evalf(a)..evalf(b), evalf((b-a)/(N-1)))],
datatype=float[8]):
u:=map(sin, x):
xx:=Vector([seq(evalf(a)..evalf(b), 0.5)],
datatype=float[8]):
P3:=Interpolation:-SplineInterpolation(x,u,degree=N-1,
endpoints=notaknot):
P3~(xx);
调用P3~(xx)
逐个元素地执行。但是那个Interpolate
命令返回的插值函数也知道如何对整个Vectorxx
进行自动(逐元素)动作,所以下面应该更高效,
P3(xx);
该示例是一维数据。还有其他方法可以获得类似的结果,显式生成多项式插值。但在评估 xx
数据时,它们的效率较低。
restart;
Digits:=15:
N:=20: (a,b):=0,2*Pi:
x:=Vector([seq(evalf(a)..evalf(b), evalf((b-a)/(N-1)))],
datatype=float[8]):
u:=map(sin, x):
xx:=Vector([seq(evalf(a)..evalf(b), 0.5)],
datatype=float[8]):
P1:=unapply(CurveFitting:-PolynomialInterpolation(x,u,'t'),'t'):
P2:=unapply(CurveFitting:-Spline(x,u,'t',degree=N-1,endpoints=notaknot),'t'):
P3:=Interpolation:-SplineInterpolation(x,u,degree=N-1,endpoints=notaknot):
sin~(xx);
P1~(xx);
P2~(xx);
P3~(xx);
plots:-display(
plot(sin, a..b, color=gray),
plots:-pointplot(<xx|P1~(xx)>, color=blue, symbol=circle, symbolsize=25),
plots:-pointplot(<xx|P2~(xx)>, color=red, symbol=circle, symbolsize=16),
plots:-pointplot(<xx|P3~(xx)>, color=black, symbol=solidcircle, symbolsize=5)
);
如果您有更大维度(例如二维)的数据x
、u
和xx
,请提供更详细的明确示例。
[编辑] 这里的数据可能更符合您在 cmets 中提供的示例(稍后)。四种方法的结果(产生 16 次多项式)相互吻合得很好。他们似乎也与 Matlab 计算的uu
非常吻合。
对您来说重要的是插值多项式在评估所需范围(即xx
)时提供的准确性。 不对您而言重要的是一种方法的特定系数是否与另一种方法的系数密切匹配。
使用插值的方法:-SplineInterpolation 是这四种方法中效率最高的。
restart;
Digits := 15:
x := <1.0000e+00,9.8079e-01,9.2388e-01,8.3147e-01,7.0711e-01,5.5557e-01,
3.8268e-01,1.9509e-01,6.1232e-17,-1.9509e-01,-3.8268e-01,-5.5557e-01,
-7.0711e-01,-8.3147e-01,-9.2388e-01,-9.8079e-01,-1.0000e+00>:
u := <0,-0.2197,-0.7659,-1.3860,-1.8554,-2.0776,-2.0706,-1.9031,
-1.6443,-1.3454,-1.0405,-0.7524,-0.4970,-0.2863,-0.1294,-0.0327,0>:
xx := <seq(-1..1,0.01)>:
exact := map(t->evalhf((exp(4*t)-sinh(4)*t-cosh(4))/16), xx):
P3:=Interpolation:-SplineInterpolation(x,u,degree=16,endpoints=notaknot):
uu3 := P3(xx):
plots:-display(
plot([ <xx|(uu3)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
plot([ <xx|(uu3-exact)> ]):
P4 := unapply(Statistics:-PolynomialFit(16, x, u, 't'), 't'):
uu4 := map[evalhf](P4,xx):
plot([ <xx|(uu4-exact)> ]);
plots:-display(
plot([ <xx|(uu4)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
P1:=unapply(CurveFitting:-PolynomialInterpolation(x,u,'t'),'t'):
uu1 := map[evalhf](P1,xx):
plot([ <xx|(uu1-exact)> ]);
plots:-display(
plot([ <xx|(uu1)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
P2:=unapply(CurveFitting:-Spline(x,u,'t',degree=16,endpoints=notaknot),'t'):
uu2 := map[evalhf](P2,xx):
plot([ <xx|(uu2-exact)> ]);
plots:-display(
plot([ <xx|(uu2)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
【讨论】:
对我的值执行代码会返回与 Matlab 代码完全不同的值。我想出了内括号的翻译,polyfit(x,u,N)
,在 Maple 中将是 P3 := ArrayTools:-FlipDimension(Statistics:-PolynomialFit(N, x, u), 1)
。现在,在 Maple 中寻找 Matlab 表达式 uu=Polyval(P3,xx)
的等价物。
这是Matlab中的整个程序代码:N = 16; x = cos(pi*(0:N)/N)'; c = [2; ones(N-1,1); 2].*(-1).^(0:N)'; X = repmat(x,1,N+1); dX = X-X'; D = (c*(1./c)')./(dX+(eye(N+1))); % off-diagonal entries D = D - diag(sum(D')); % diagonal entries D2 = D^2; D2 = D2(2:N,2:N); % boundary conditions f = exp(4*x(2:N)); u = D2\f; % Poisson eq. solved here u = [0;u;0]; xx = -1:.01:1; P3=polyfit(x,u,N); uu = polyval(P3,xx); % interpolate grid data exact = ( exp(4*xx) - sinh(4)*xx - cosh(4) )/16;
我添加了更接近 Matlab 示例生成的 x
、u
和 xx
数据的代码。
注意:1) 我使用了x
和u
数据,四舍五入到5 位,所以不要担心与“精确”值或生成的@987654349 比较Maple 中的 @ 与 Matlab 中的 uu
(后者使用更多的输入数字)。 2) 这里可能无关紧要,但PolynomialFit
通常不是构造插值多项式的最稳健的方法。 3) SplineInterpolation
可能会更好,即使替代显式多项式在unapply
之前转换为horner 形式。 4)我不知道为什么你更喜欢单一的高度多边形,而不是分段样条曲线较低的度数。以上是关于这个 Matlab 代码的 Maple 翻译是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Maple 中的符号变量导出到文本文件(Matlab 格式)?
matlab 对原始图像灰度级压缩,将Gray量化成16级 下面的这个代码是啥意思 有没有会matlab的