Transfer Code from Mathematica to Matlab
5 views (last 30 days)
Show older comments
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;
0 Comments
Accepted Answer
Walter Roberson
on 9 Jan 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 Comments
Walter Roberson
on 10 Jan 2016
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.
More Answers (1)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!