# Exporting a code from Maple to Matlab

42 views (last 30 days)

Show older comments

student_md
on 16 Oct 2020

Commented: Walter Roberson
on 6 Oct 2024 at 20:53

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 Comments

Rik
on 16 Oct 2020

### Accepted Answer

Walter Roberson
on 16 Oct 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 Comments

Walter Roberson
on 2 Dec 2020

### More Answers (2)

KSSV
on 16 Oct 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 Comments

Walter Roberson
on 6 Oct 2024 at 20:53

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.

### See Also

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!