Exporting a code from Maple to Matlab
31 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
student_md
il 16 Ott 2020
Commentato: Walter Roberson
il 6 Ott 2024
I use Matlab for numerical calculations.
But I use Maple for symbolic calculations and after the calculations I usually get piecewise functions in my maple codes.
I think the 3d plots in Matlab is very attractive more than Maple plots. So, I want to export piecewise functions in maple to a Matlab code in order to utilize advantages of plots of Matlab.
MAPLE CODE
restart:
u:=1/(1. + exp(x))^2 + 1/(1. + exp(-5.*t))^2 - 0.2500000000 + x*(1/(1. + exp(1 - 5*t))^2 - 1./((1. + exp(-5*t))^2) + 0.1776705118 + 0.0415431679756514*piecewise(0. <= t and t <= 0.5000000000, 1.732050808, 0.) + 0.00922094377856479*piecewise(0. <= t and t <= 0.5000000000, 30.98386677*t - 7.745966692, 0.) + 0.0603742508215732*piecewise(0.5000000000 <= t and t <= 1., 1.732050808, 0.) - 0.00399645630498528*piecewise(0.5000000000 <= t and t <= 1., 30.98386677*t - 23.23790008, 0.)) + (-0.00243051684581302*piecewise(0. <= x and x <= 0.5000000000, 1.732050808, 0.) - 0.000809061198761621*piecewise(0. <= x and x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.) - 0.0152377552205917*piecewise(0.5000000000 <= x and x <= 1., 1.732050808, 0.) - 0.00195593427342862*piecewise(0.5000000000 <= x and x <= 1., 30.98386677*x - 23.23790008, 0.))*piecewise(0. <= t and t <= 0.5000000000, 1.732050808, 0.) + (-0.000433590063316381*piecewise(0. <= x and x <= 0.5000000000, 1.732050808, 0.) - 0.000146112803263678*piecewise(0. <= x and x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.) - 0.00319022339097685*piecewise(0.5000000000 <= x and x <= 1., 1.732050808, 0.) - 0.000477063086307787*piecewise(0.5000000000 <= x and x <= 1., 30.98386677*x - 23.23790008, 0.))*piecewise(0. <= t and t <= 0.5000000000, 30.98386677*t - 7.745966692, 0.) + (-0.00276114805649180*piecewise(0. <= x and x <= 0.5000000000, 1.732050808, 0.) - 0.000933166016624500*piecewise(0. <= x and x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.) - 0.0207984584912892*piecewise(0.5000000000 <= x and x <= 1., 1.732050808, 0.) - 0.00314360556336114*piecewise(0.5000000000 <= x and x <= 1., 30.98386677*x - 23.23790008, 0.))*piecewise(0.5000000000 <= t and t <= 1., 1.732050808, 0.) + (0.000172746997599710*piecewise(0. <= x and x <= 0.5000000000, 1.732050808, 0.) + 0.0000586775450031145*piecewise(0. <= x and x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.) + 0.00136190009033518*piecewise(0.5000000000 <= x and x <= 1., 1.732050808, 0.) + 0.000211410172315387*piecewise(0.5000000000 <= x and x <= 1., 30.98386677*x - 23.23790008, 0.))*piecewise(0.5000000000 <= t and t <= 1., 30.98386677*t - 23.23790008, 0.):
>
plot3d( u,
x=0..1,
t=0..1,
style=surface,
axes=boxed,
colorscheme=[yellow, red]
);
We can transform a maple code to Matlab code by using
with(CodeGeneration):
Matlab(u,resultname="w");
. But The code can' t properly transform to Matlab code.
Could you help me pls
2 Commenti
Rik
il 16 Ott 2020
Is your question how to implement this code in Matlab, or how to successfully convert the code in Maple? As it stands now your question seems better suited to a Maple forum.
Risposta accettata
Walter Roberson
il 16 Ott 2020
Optimized version of the calculation:
t1 = exp(x);
t21 = -5 .* t;
t3 = exp(t21);
t5 = exp((1 + t21));
t4 = ((0 <= t & t <= 1/2) .* 1.73205);
t5 = ((0 <= t & t <= 1/2) .* (30.9839 .* t - 7.74597));
t6 = ((1/2 <= t & t <= 1) .* 1.73205);
t7 = ((1/2 <= t & t <= 1) .* (30.9839 .* t - 23.2379));
t6 = (1 + t5).^2;
t2 = 1 ./ t6;
t7 = (1 + t3).^2;
t3 = 1 ./ t7;
t8 = -0.00399646;
t9 = 0.00922094;
t10 = 0.0415432;
t11 = 0.0603743;
t12 = 0.177671;
t13 = ((0 <= x & x <= 1/2) .* 1.73205);
t14 = ((0 <= x & x <= 1/2) .* (30.9839 .* x - 7.74597));
t15 = ((1/2 <= x & x <= 1) .* 1.73205);
t16 = ((1/2 <= x & x <= 1) .* (30.9839 .* x - 23.2379));
t8 = (1 + t1).^2;
t1 = 1 ./ t8;
u1 = -1/4 + (-0.00243052 .* t13 - 0.000809061 .* t14 - 0.00195593 .* t16 - 0.0152378 .* t15) .* t4 + (-0.00043359 .* t13 - 0.000146113 .* t14 - 0.000477063 .* t16 - 0.00319022 .* t15) .* t5 + (-0.00276115 .* t13 - 0.000933166 .* t14 - 0.00314361 .* t16 - 0.0207985 .* t15) .* t6 + t7 .* (0.000172747 .* t13 + 0.0013619 .* t15 + 0.00021141 .* t16 + 5.86775e-05 .* t14) + x .* (t10 .* t4 + t11 .* t6 + t5 .* t9 + t7 .* t8 + t12 + t2 - t3) + t3 + t1;
Unoptimized version of the calculation.
u1 = 1 ./ (1 + exp(x)).^2 + 1 ./ (1 + exp(-(5 .* t))).^2 - 1/4 + x .* (1 ./ (1 + exp((1 - 5 .* t))).^2 - 1 ./ (1 + exp(-(5 .* t))).^2 + 0.177671 + 0.0415432 .* ((0 <= t & t <= 1/2) .* 1.73205) + 0.00922094 .* ((0 <= t & t <= 1/2) .* (30.9839 .* t - 7.74597)) + 0.0603743 .* ((1/2 <= t & t <= 1) .* 1.73205) - 0.00399646 .* ((1/2 <= t & t <= 1) .* (30.9839 .* t - 23.2379))) + (-0.00243052 .* ((0 <= x & x <= 1/2) .* 1.73205) - 0.000809061 .* ((0 <= x & x <= 1/2) .* (30.9839 .* x - 7.74597)) - 0.0152378 .* ((1/2 <= x & x <= 1) .* 1.73205) - 0.00195593 .* ((1/2 <= x & x <= 1) .* (30.9839 .* x - 23.2379))) .* ((0 <= t & t <= 1/2) .* 1.73205) + (-0.00043359 .* ((0 <= x & x <= 1/2) .* 1.73205) - 0.000146113 .* ((0 <= x & x <= 1/2) .* (30.9839 .* x - 7.74597)) - 0.00319022 .* ((1/2 <= x & x <= 1) .* 1.73205) - 0.000477063 .* ((1/2 <= x & x <= 1) .* (30.9839 .* x - 23.2379))) .* ((0 <= t & t <= 1/2) .* (30.9839 .* t - 7.74597)) + (-0.00276115 .* ((0 <= x & x <= 1/2) .* 1.73205) - 0.000933166 .* ((0 <= x & x <= 1/2) .* (30.9839 .* x - 7.74597)) - 0.0207985 .* ((1/2 <= x & x <= 1) .* 1.73205) - 0.00314361 .* ((1/2 <= x & x <= 1) .* (30.9839 .* x - 23.2379))) .* ((1/2 <= t & t <= 1) .* 1.73205) + (0.000172747 .* ((0 <= x & x <= 1/2) .* 1.73205) + 5.86775e-05 .* ((0 <= x & x <= 1/2) .* (30.9839 .* x - 7.74597)) + 0.0013619 .* ((1/2 <= x & x <= 1) .* 1.73205) + 0.00021141 .* ((1/2 <= x & x <= 1) .* (30.9839 .* x - 23.2379))) .* ((1/2 <= t & t <= 1) .* (30.9839 .* t - 23.2379));
Before this you would do the kind of meshgrid() bit that KSSV indicated, and you could surf() the way he did as well.
6 Commenti
Walter Roberson
il 2 Dic 2020
Unfortunately I recently had a disk crash that affected the drive I was using and the automatic backups of it. I had copied files from it not long before that, but a bunch of the copied files are empty, and I fear that my entire progress on this topic might have vanished.
Più risposte (2)
KSSV
il 16 Ott 2020
Some thing like this:
x = linspace(0,1) ;
t = linspace(0,1) ;
[x,t] = meshgrid(x,t) ;
u =1./(1. + exp(x)).^2 + 1./(1. + exp(-5.*t)).^2 - 0.2500000000 + x.*(1./(1. + exp(1 - 5*t)).^2 - 1./((1. + exp(-5*t)).^2) .......
+ 0.1776705118 + 0.0415431679756514*piecewise(0. <= t && t <= 0.5000000000, 1.732050808, 0.) .......
+ 0.00922094377856479*piecewise(0. <= t && t <= 0.5000000000, 30.98386677*t - 7.745966692, 0.) .........
+ 0.0603742508215732*piecewise(0.5000000000 <= t && t <= 1., 1.732050808, 0.) ..........
- 0.00399645630498528*piecewise(0.5000000000 <= t && t <= 1., 30.98386677*t ........
- 23.23790008, 0.)) + (-0.00243051684581302*piecewise(0. <= x && x <= 0.5000000000, 1.732050808, 0.).........
- 0.000809061198761621*piecewise(0. <= x && x <= 0.5000000000, 30.98386677*.x .........
- 7.745966692, 0.) - 0.0152377552205917*piecewise(0.5000000000 <= x && x <= 1., 1.732050808, 0.) ........
- 0.00195593427342862*piecewise(0.5000000000 <= x && x <= 1., 30.98386677*x - 23.23790008, 0.)).*piecewise(0. <= t && t <= 0.5000000000, 1.732050808, 0.) ........
+ (-0.000433590063316381*piecewise(0. <= x && x <= 0.5000000000, 1.732050808, 0.) .........
- 0.000146112803263678*piecewise(0. <= x && x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.) .........
- 0.00319022339097685*piecewise(0.5000000000 <= x && x <= 1., 1.732050808, 0.) ...........
- 0.000477063086307787*piecewise(0.5000000000 <= x && x <= 1., 30.98386677*x - 23.23790008, 0.)).*piecewise(0. <= t && t <= 0.5000000000, 30.98386677*t - 7.745966692, 0.) .........
+ (-0.00276114805649180*piecewise(0. <= x && x <= 0.5000000000, 1.732050808, 0.) .......
- 0.000933166016624500*piecewise(0. <= x && x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.)...............
- 0.0207984584912892*piecewise(0.5000000000 <= x && x <= 1., 1.732050808, 0.) .............
- 0.00314360556336114*piecewise(0.5000000000 <= x && x <= 1., 30.98386677*x - 23.23790008, 0.)).*piecewise(0.5000000000 <= t && t <= 1., 1.732050808, 0.) ..............
+ (0.000172746997599710*piecewise(0. <= x && x <= 0.5000000000, 1.732050808, 0.) + 0.0000586775450031145*piecewise(0. <= x && x <= 0.5000000000, 30.98386677*x - 7.745966692, 0.) .............
+ 0.00136190009033518*piecewise(0.5000000000 <= x && x <= 1., 1.732050808, 0.) .......
+ 0.000211410172315387*piecewise(0.5000000000 <= x && x <= 1., 30.98386677*x - 23.23790008, 0.)).*piecewise(0.5000000000 <= t && t <= 1., 30.98386677*t - 23.23790008, 0.) ;
surf(x,t,u)
shading interp
colorbar
If error throws, may be you have to use element by element multiplication .*.
or use element by element divison, ./
Replace and with &&
Or Repalce all && with &.
3 Commenti
Walter Roberson
il 6 Ott 2024
function result = piecewise(condition, truevalue, falsevalue)
if numel(truevalue) == 1
result = repmat(truevalue, size(condition))
else
result = truevalue;
end
if numel(falsevalue) == 1
result(~condition) = falsevalue;
else
result(~condition) = falsevalue(~condition);
end
end
or something similar that accounts for the possibility that the true or false conditions might be expressed as scalars.
There is the possibility that the condition might be a scalar but the truevalue or falsevalue might be non-scalar. In such a case, the result of the piecewise() should be the entire non-scalar truevalue or falsevalue; the above code does not work properly for this case.
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!