How can i optimize the code and connect the functions?

조회 수: 1 (최근 30일)
João Novais
João Novais 2021년 7월 14일
댓글: Star Strider 2021년 7월 16일
Hi everyone!
I've been dabbling with MatLab for the past three days and 've managed to write the following, working, code.
eta_l = xlsread('calculos.xlsx','Theoretical Predictions','S2');
eta_0 = xlsread('calculos.xlsx','Theoretical Predictions','S3');
l_c = xlsread('calculos.xlsx','Theoretical Predictions','P3');
sigma_f = xlsread('calculos.xlsx','Base Values','B3');
v_f = xlsread('calculos.xlsx','Burn','E23');
E_m = xlsread('calculos.xlsx','Base Values','D2');
E_f = xlsread('calculos.xlsx','Base Values','B2');
d = xlsread('calculos.xlsx','Base Values','B5');
%basically these functions y1 and y2 should be connected but i haven't been able to connect them
%plot of the Kelly-Tyson equation
x=linspace(-10,50);
idx = x < l_c;
y1=((eta_l.*eta_0.*((v_f.*sigma_f.*E_m)./(E_f.*d.*sqrt(3))).*x(idx))+((sigma_f.*E_m.*(1-v_f))./E_f));
y2=(eta_l.*eta_0.*(((-sigma_f.*v_f.*l_c)./2).*(1./x(~idx))+(sigma_f.*v_f)))+(((sigma_f.*E_m)./E_f).*(1-v_f));
plot(x(idx),y1,x(~idx),y2);
ylim([0 1000]);
grid on
hold on
%basically these next two bits are the same and i would like to not repeat
%them and get the same to points in the plot
%plot of the 95% of the max of the Kelly-Tyson equation
syms x
f=(eta_l.*eta_0.*(((-sigma_f.*v_f.*l_c)./2).*(1./x)+(sigma_f.*v_f)))+(((sigma_f.*E_m)./E_f).*(1-v_f));
maximus=limit(f,Inf);
eqn=f==0.95.*maximus;
S=solve(eqn,x);
plot(S,0.95.*maximus,'r*')
hold on
%plot of the 98% of the max of Kelly-Tyson equation
syms x
f1=(eta_l.*eta_0.*(((-sigma_f.*v_f.*l_c)./2).*(1./x)+(sigma_f.*v_f)))+(((sigma_f.*E_m)./E_f).*(1-v_f));
maximus1=limit(f1,Inf);
eqn1=f1==0.98.*maximus1;
S1=solve(eqn1,x);
plot(S1,0.98.*maximus1,'r*')
hold off
But... The last two bits are basically me writing them again and again. Is there a way where i can optimize the code so that i get a plot with the graphs of the functions connected - that is because they are connected in reality - and the points ploted but without having to write basically the same thing twice?
Thanks in advance!

채택된 답변

Star Strider
Star Strider 2021년 7월 14일
The syms call is not necessary.
Try something like this instead:
% syms x
f= @(x) (eta_l.*eta_0.*(((-sigma_f.*v_f.*l_c)./2).*(1./x)+(sigma_f.*v_f)))+(((sigma_f.*E_m)./E_f).*(1-v_f));
maximus = f(max(x));
eqn = @(x)f(x)*0.95.*maximus;
x0 = rand;
S=fsolve(eqn,x0);
plot(S,0.95.*maximus,'r*')
hold on
%plot of the 98% of the max of Kelly-Tyson equation
% syms x
f1= @(x) (eta_l.*eta_0.*(((-sigma_f.*v_f.*l_c)./2).*(1./x)+(sigma_f.*v_f)))+(((sigma_f.*E_m)./E_f).*(1-v_f));
maximus1=f1(max(x));
eqn1= @(x)f1(x)*0.98.*maximus1;
S1=fsolve(eqn1,x0);
plot(S1,0.98.*maximus1,'r*')
hold off
The functions each appear to be an inverse function of ‘x’, so will likely have only one root. (I cannot determine if the functions have a zero-crossing, so it is possible that there are no roots.) I am not certain what the limit call is doing, since the part of the function that contains the term will go to 0 in the limit, leaving only the additive terms that are not a function of ‘x’.
.
  댓글 수: 6
João Novais
João Novais 2021년 7월 16일
This... Is... Perfect!
Thank you so much once again!
Star Strider
Star Strider 2021년 7월 16일
As always, my pleasure!
.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Sulaymon Eshkabilov
Sulaymon Eshkabilov 2021년 7월 14일
One quick and easy suggestion is to employ readtable() instead of xlsread().

카테고리

Help CenterFile Exchange에서 Solver Outputs and Iterative Display에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by