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;

 Akzeptierte Antwort

Walter Roberson
Walter Roberson am 9 Jan. 2016

0 Stimmen

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 Kommentare

Theon
Theon am 9 Jan. 2016
Bearbeitet: Theon am 9 Jan. 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 am 10 Jan. 2016
Is the intention that zSolution should be the z such that z is a root of eqchem near 0.01 ?
Theon
Theon am 10 Jan. 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 am 10 Jan. 2016
Thank you so much.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

mohammad hodaei
mohammad hodaei am 23 Apr. 2020

0 Stimmen

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

1 Kommentar

Walter Roberson
Walter Roberson am 23 Apr. 2020
Mathematica has a function to translate Mathematica into MATLAB.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu MATLAB finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by