Transfer Code from Mathematica to Matlab

I'm trying to transfer the following code from Mathematica to Matlab but I'm having trouble. Can anyone help?
n[x_, z_, T_] = 1/(Exp[x/T]*z + 1)
f[x_] = (3/2)*Sqrt[x]
eqchem[z_, T_] =
1 == Integrate[f[x]*n[x, z, T], {x, 0, \[Infinity]}, Assumptions -> {T > 0}]
zSolution[T_] := z /. FindRoot[Evaluate[eqchem[z, T]], {z, .01}]
points = Prepend[Table[{T, -T Log[zSolution[T]]}, {T, 0.1, 5, 0.1}], {0., 1.}] // Re;

 Respuesta aceptada

Walter Roberson
Walter Roberson el 9 de En. de 2016
n = @(x, z, T) 1./(exp(x./T).*z + 1);
f = @(x) (3/2)*sqrt(x);
eqchem = @(z, T) integral(@(x) f(x)*n(x, z, T), 0, inf) - 1;
At this point the Mathematica code provided breaks down. It uses z without z being a parameter. We could add it as a parameter to zSolution, an assumption that it should have been written as
zSolution[T_, z_] := ....
but then we need to pass in two parameters in the reference to zSolution that appears in points. We can see that there is explicit range of T values being iterated over in the Table construction, but there is no match for z there. Is the table built to be symbolic in z? Or is the {0., 1.} intended to be a z range, or is that {0., 1.} intended to be a final (or leading) point in the table being constructed?
Perhaps I am misunderstanding the meaning of the zSolution code. The /. operator looks like you might have intended a rule replacement, but the right side of the ./ does not appear to be in the form of a Mathematica rule. Is the intention that zSolution should be the z such that z is a root of eqchem near 0.01 ?

5 comentarios

Theon
Theon el 9 de En. de 2016
Editada: Theon el 9 de En. de 2016
I'm trying to use "points" to plot a figure with this command:
ListPlot[points, GridLines -> Automatic, Frame -> True]
In Mathematica, it works..
{0., 1.} is intended to be a leading point in the table being constructed.
Walter Roberson
Walter Roberson el 10 de En. de 2016
Is the intention that zSolution should be the z such that z is a root of eqchem near 0.01 ?
Theon
Theon el 10 de En. de 2016
Yes that is the intention.
zSolution = @(T) fzero(@(Z) -1 + integral(@(x) (3/2)*x^(1/2)/(exp(x/T)*Z+1), 0,inf), [eps(realmin),20]);
t = 0.1 : 0.1 : 5;
points = arrayfun(zSolution, t);
scatter([0,t], [1,points])
The 20 upper bound is arbitrary, needed to get the fzero to work for t = 5. The necessary upper bound goes up fairly quickly: for example by t = 17.87 you need slightly more than 100.
If you do not put in a range, just an initial point, then fzero will head to negatives and the integral will start to fail.
Theon
Theon el 10 de En. de 2016
Thank you so much.

Iniciar sesión para comentar.

Más respuestas (1)

mohammad hodaei
mohammad hodaei el 23 de Abr. de 2020

0 votos

But, I have codes around 28000 line. how do i tranfer it?

1 comentario

Walter Roberson
Walter Roberson el 23 de Abr. de 2020
Mathematica has a function to translate Mathematica into MATLAB.

Iniciar sesión para comentar.

Categorías

Más información sobre MATLAB en Centro de ayuda y File Exchange.

Preguntada:

el 8 de En. de 2016

Comentada:

el 23 de Abr. de 2020

Community Treasure Hunt

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

Start Hunting!

Translated by