How to convert symbolic output to numeric value in Symbolic Math Toolbox?

346 Ansichten (letzte 30 Tage)
Dear MATLAB users,
I tried to calculate following problem using Symbolic Math Toolbox.
Unfortunately, I have faced some problems using Symbolic Math Toolbox.
My code is as follows.
My problem is when i run this code, when the mu is small number, the P0, Pmu an Pc is calculated as numerical value.
But, starts from some points, the results are shown like 'round((513*vpasum(Inf/gamma(n + 181), n, 0, Inf))/2500)'.
When i tried to convert this kind of output to numerical value, it fails.
Therefore, is there any way to convert this kind of output to numerical value?
Thanks in advance!
syms n mu P0 Pmu Pc obj sigma lambda k
lambda=20
sigma=0.1
for mu=1:40
an=symprod(lambda/(mu+(k*sigma)),k,1,n);
P0=1/(1+symsum(an,n,1,Inf));
Pmu=mu*P0_record*vpa(symsum(((lambda^n)*gamma(1+(mu/sigma)))/((sigma^n)*(mu+n*sigma)*gamma(1+n+(mu/sigma))),n,0,Inf));
Pc=(1-P0)*(mu/(mu+sigma));
obj=Pmu*Pc;
P0_record(mu)=round(P0,4);
Pmu_record(mu)=round(Pmu,4);
Pc_record(mu)=round(Pc,4);
obj_record(mu)=round(obj,4);
end

Akzeptierte Antwort

Paul
Paul am 7 Feb. 2023
Bearbeitet: Paul am 7 Feb. 2023
My first inclination was to stay symbolic all the way through and then compute numerical values at the end.
syms lambda mu sigma positive
syms n k integer
a_n = symprod(lambda/(mu + k*sigma),k,1,n);
a_n = simplify(a_n,10)
a_n = 
P_0 = 1/(1 + symsum(a_n,n,1,inf));
P_0 = simplify(P_0,10)
P_0 = 
P_n = P_0*a_n
P_n = 
P_mu = symsum(P_n*(mu/(mu + n*sigma)),n,0,inf)
P_mu = 
P_c = (1 - P_0)*(mu/(mu + sigma))
P_c = 
Now evaluate using subs. For example
muval = (1:40).';
Pc_record = subs(P_c, [lambda sigma mu] , {20, 0.1 , muval});
Pmu_record = subs(P_mu, [lambda sigma mu] , {20, 0.1 , muval});
P0_record = subs(P_0, [lambda sigma mu] , {20, 0.1 , muval});
VPA to see the values. Need to increase digits to deal with very large terms in the expressions.
digits(100);
figure
h1 = subplot(211);hold on;plot(muval,real(vpa(Pc_record))),ylabel('real(Pc)')
h2 = subplot(212);hold on;plot(muval,imag(vpa(Pc_record))),ylabel('imag(Pc)');xlabel('mu')
figure
h3 = subplot(211);hold on;plot(muval,real(vpa(Pmu_record))),ylabel('real(Pmu)')
h4 = subplot(212);hold on;plot(muval,imag(vpa(Pmu_record))),ylabel('imag(Pmu)');xlabel('mu')
figure
h5 = subplot(211);hold on;plot(muval,real(vpa(P0_record))),ylabel('real(P0)')
h6 = subplot(212);hold on;plot(muval,imag(vpa(P0_record))),ylabel('imag(P0)'),xlabel('mu')
It looks like for large vaues of mu some error is creeping into the vpa calculations yielding a very, very, small imaginary component even with digits(100). I assume that imaginary part can be safely ignored. Or maybe use more digits? Or maybe the expressions can be further simplified symbolically before subbing in specific values. Sometimes that helps.
Alternatively, setting lambda and sigma ahead of the loop seems to work better, but slower. Couldn't run for all values of mu because it takes too long (takes much longer to run here than on my local machine)
digits(32) % reset to default
clear P0_record Pmu_record Pc_record
syms lambda mu sigma positive
syms n k integer
lambda = sym(20);
sigma = sym(0.1);
Can only use a few values of muval to stay under the Answers runtime limit
muval = [1:8:40 40];
for ii = 1:numel(muval)
mu = sym(muval(ii));
a_n = symprod(lambda/(mu + k*sigma),k,1,n);
a_n = simplify(a_n,10);
P_0 = 1/(1 + symsum(a_n,n,1,inf));
P_0 = simplify(P_0);
P_n = P_0*a_n;
P_mu = symsum(P_n*(mu/(mu + n*sigma)),n,0,inf);
P_c = (1 - P_0)*(mu/(mu + sigma));
Pc_record(ii) = double(P_c);
Pmu_record(ii) = double(P_mu);
P0_record(ii) = double(P_0);
end
plot(h1,muval,real(Pc_record),'-x'),grid
plot(h2,muval,imag(Pc_record),'-x'),grid
plot(h3,muval,real(Pmu_record),'-x'),grid
plot(h4,muval,imag(Pmu_record),'-x'),grid
plot(h5,muval,real(P0_record),'-x'),grid
plot(h6,muval,imag(P0_record),'-x'),grid

Weitere Antworten (2)

KSSV
KSSV am 7 Feb. 2023
Read about double, vpasolve.

Amal Raj
Amal Raj am 7 Feb. 2023
Hi,
You can use the vpa function to convert the symbolic expression to a numerical value with a specified number of digits.
Then go on with the calculation.
P0=1/(1+symsum(an,n,1,Inf));
Pmu=mu*P0_record*vpa(symsum(((lambda^n)*gamma(1+(mu/sigma)))/((sigma^n)*(mu+n*sigma)*gamma(1+n+(mu/sigma))),n,0,Inf));
Pc=(1-P0)*(mu/(mu+sigma));
% 32 significat digits
P0=vpa(1/(1+symsum(an,n,1,Inf)),32);
Pmu=vpa(mu*P0_record*vpa(symsum(((lambda^n)*gamma(1+(mu/sigma)))/((sigma^n)*(mu+n*sigma)*gamma(1+n+(mu/sigma))),n,0,Inf)),32);
Pc=vpa((1-P0)*(mu/(mu+sigma)),32);

Produkte


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by