Matlab — это язык программирования, который существует уже некоторое время и остается популярным по сей день. Scilab является братом Matlab с открытым исходным кодом, поэтому мы будем использовать оба взаимозаменяемо для наших целей. Matlab и Scilab — отличные языки для вычислительного программирования для компьютерных ученых и других специалистов, которые могут использовать возможности этого языка для быстрой обработки больших наборов данных. Matlab или Scilab должны быть широко известны благодаря всем процессам, поддающимся количественной оценке, поскольку они позволяют автоматизировать и сокращать время, делая нашу жизнь немного проще. В этой статье мы рассмотрим многочисленные примеры того, как Matlab и Scilab можно применять для решения уникальных задач.

Простые вычисления с Matlab

% Name: Roberto Carlos Baldizon Diaz
% Matlab for array calculations
A=[1, 3, 5];
B=[-3, -2, 4];
dot(A, B)
ans =
11
 
a=[0, -1, -4, -8];
b=[4, -2, -3, 24];
dot(a, b)
ans =
-178
% Matlab for array calculations with scientific application
D=[1.2; 7.8; 2.7];
V=[700; 200; 300];
disp(‘Total Mass of Components in Grams:’)
M=dot(D, V)
Total Mass of Components in Grams:
M =
3210
% Matlab for simple array algebra
 
A2=[12, 4; 3, -5];
B2=[2, 12; 0, 0];
A2*B2
ans =
24 144
 6 36
 
a2=[1, 3, 5; 2, 4, 6]’;
b2=[-2, 4; 3, 8; 12, -2]’;
a2*b2
ans =
6 19 8
 10 41 28
 14 63 48
% Matlab to find array's determinants and inverses
a3=[2, -1; 4, 5];
b3=[4, 2; 2, 1];
c3=[2, 0, 0; 1, 2, 2; 5, -4, 0];
disp(‘Determinant and Inverse(if exists) of A’)
det(a3)
inv(a3)
disp(‘Determinant and Inverse(if exists) of B’)
det(b3)
disp(‘Determinant and Inverse(if exists) of B’)
det(c3)
inv(c3)
Determinant and Inverse(if exists) of A
ans =
14
ans =
0.3571 0.0714
 -0.2857 0.1429
Determinant and Inverse(if exists) of B
ans =
0
Determinant and Inverse(if exists) of B
ans =
16.0000
ans =
0.5000 0 0
 0.6250 0 -0.2500
 -0.8750 0.5000 0.2500
clear, clc

Вычисление гидродинамики с помощью Scilab

clear
//INPUT
frul=5.5; //w/m²C
ta=118; //C
ti=30; //C
//CALCULATIONS
qu=-frul*(ti-ta);
//RESULTS
qu

Солнечные инженерные расчеты с помощью Scilab

clear
//CONSTANTS
eg=0.88; 
//Glass emittence given
b=45;
//Collector tilt in degrees assumed
s=5.67*10^-8;
//Stefan-Boltzmann Constant in W/m²K^-4
//INPUT
hw=20; 
//Wind heat transfer coeff. in W/m²C
ep=0.1; 
//Plate emittence
tpc=100; 
//Plate temperature in C
tac=40; 
//Ambient temperature in C
n=1; 
//Number of covers
//CALCULATIONS
tpm=tpc+273.15; 
//Mean plate temperature in K
ta=tac+273.15;
//Plate temperature in K
f=(1+0.089*hw-0.1166*hw*ep)*(1+0.07866*n);
//Variable for Equation 6.4.9
c=520*(1–0.000051*b²);
//Variable for Equation 6.4.9
e=0.430*(1–100/tpm);
//Variable for Equation 6.4.9
//FORMULA
ut=(n/(c/tpm*((tpm-ta)/(n+f))^e)+1/hw)^-1 + (s*(tpm+ta)*(tpm²+ta²))/(1/(ep+0.00591*n*hw)+(2*n+f-1+0.133*ep)/eg-n);
//Equation 6.4.9
//OUTPUT
ut
//Result

Дополнительные расчеты солнечной энергетики с помощью Scilab

clear
//INPUT
phi=39.7392;
n=160;
lstd=-105;
lloc=-104.9903;
timemin=630;
//CALCULATIONS
delta=23.45*sind((360/365)*(284+n));
B=360*((n-1)/365);
E_t=(229.2*.000075)+229.2*(.001868*cosd(B)..
-.032077*sind(B))-229.2*(.014615*cosd(2*B)..
+.04089*sind(2*B)); // units of min
t_lambda=4*(lstd-lloc); // units of min
TC=E_t+t_lambda; // min
t_sol=timemin+TC-60; // min
t=t_sol/60 // hr
//RESULTS
omega=(t-12)*15;
d=23.45*sind(360/365*(284+n));

Еще больше расчетов солнечной энергетики с помощью Scilab

clear
//INPUT
beta = 34; // collector tilt
gamma = 5; // collector azimuth
phi= 40.44; // latitude of Pittsburgh, PA
omega= -18.81; // 11h30 solar time
delta= 14.43; // Aug 13
//CALCULATIONS
theta = acosd((sind(phi)*sind(delta)*cosd(beta))-..
(cosd(phi)*sind(delta)*sind(beta)*cosd(gamma))+..
(cosd(phi)*cosd(delta)*cosd(beta)*cosd(omega))+..
(sind(phi)*cosd(delta)*sind(beta)*cosd(gamma)*cosd(omega))+..
(cosd(delta)*sind(beta)*sind(omega)*sind(gamma)));
//RESULTS
theta
clear
//INPUT
n=131;
lstd=-90;
lloc=-87.6298;
tsolmin=900;
//CALCULATIONS
delta=23.45*sind((360/365)*(284+n));
B=360*((n-1)/365);
E_t=(229.2*.000075)+229.2*(.001868*cosd(B)..
-.032077*sind(B))-229.2*(.014615*cosd(2*B)..
+.04089*sind(2*B)); // units of min
t_lambda=4*(lstd-lloc); // units of min
TC=E_t+t_lambda; // min
timemin=tsolmin+TC-60; // min
//RESULTS
t=timemin/60 // hr

Нефтегазовая инженерия с Matlab

%%%%%%%%%Thomas Algorithm Solver Function%%%%%%%%%%%%%
function x = TDMAsolver(a,b,c,d)
n = length(b);
c(1) = c(1) / b(1);
d(1) = d(1) / b(1);
for i = 2:n-1
temp = b(i) - a(i) * c(i-1);
c(i) = c(i) / temp;
d(i) = (d(i) - a(i) * d(i-1)) / temp;
end
d(n) = (d(n) - a(n) * d(n-1))/( b(n) - a(n) * c(n-1));
x(n) = d(n);
for i = n-1:-1:1
x(i) = d(i) - c(i) * x(i + 1);
end
%%%%%%%%%%Time Steps Plotting Program%%%%%%%%%%%%%%%%%
clear;
close all;
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
p=[p0,p,pl];
alpha=4;
dt=1000;
for i=1:dt
p(i+1,1)=p0;
p(i+1,2+n)=pl;
for j=2:(n+1)
p(i+1,j)=(p(i,j-1)-(2-alpha)*p(i,j)+p(i,j+1))/alpha;
end;
end;
plot(dx,p(2,2:(n+1)),'-ok');
hold on;
plot(dx,p(11,2:(n+1)),'-or');
plot(dx,p(101,2:(n+1)),'-og');
plot(dx,p(1001,2:(n+1)),'-ob');
xlabel('Distance (ft)', 'Fontsize',16);
ylabel('Pressure (psia)','Fontsize',16);

a=ones(n,1);
b=ones(n,1)*(-2);
c=ones(n,1);
d=zeros(n,1);
a(1)=0;
c(n)=0;
d(1)=-p0;
d(n)=pl;
pss=TDMAsolver(a,b,c,d);
plot(dx,pss,'-om');
legend('1 Time Step','10 Time Steps','100 Time Steps', '1000 Time Steps','Steady State');
set(gca,'Fontsize',12);

%%%%%%%%%%%%%%Plot Unstable and Steady state Results%%%%%%%%%%%%
clear;
close all;
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
p=[p0,p,pl];
alpha=1;
dt=3;
for i=1:dt
p(i+1,1)=p0;
p(i+1,2+n)=pl;
for j=2:(n+1)
p(i+1,j)=(p(i,j-1)-(2-alpha)*p(i,j)+p(i,j+1))/alpha;
end;
end;
plot(dx,p(dt+1,2:(n+1)),'-ok');
hold on;
xlabel('Distance (ft)', 'Fontsize',16);
ylabel('Pressure (psia)','Fontsize',16);
a=ones(n,1);
b=ones(n,1)*(-2);
c=ones(n,1);
d=zeros(n,1);
a(1)=0;
c(n)=0;
d(1)=-p0;
d(n)=pl;
pss=TDMAsolver(a,b,c,d);
plot(dx,pss,'-om');
legend('3 Time Steps','Steady State');
set(gca,'Fontsize',12);

Значение, используемое в этом вопросе, равно α = 1, что составляет половину требуемой константы для стабильности, как видно на графике, результатом такого значения являются колебания в пределах отрицательных и положительных значений. На устойчивое решение не влияет альфа, поскольку она не используется при расчете результата, для которого отношение остается прежним. В этом случае использовался временной шаг Dt=3, для которого количество колебаний и результатов меньше, что позволяет сравнить поведение обеих функций. Если бы временной шаг был больше, результаты также были бы больше, а колебания были бы более выраженными, из-за чего стационарное решение выглядело бы как прямая плоская линия.

clear;
close all;
%%%%%%%%%%%%%%%Implicit Solution%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
alpha=4;
dt=100;
a=ones(n,1);
b=-ones(n,1)*(2+alpha);
c=ones(n,1);
d=-p*alpha;
a(1)=0;
c(n)=0;
d(1)=-p0+d(1);
d(n)=pl+d(n);
for i=1:dt
p(i+1,:)=TDMAsolver(a,b,c,d);
d=-p(i+1,:)*alpha;
d(1)=-p0+d(1);
d(n)=-pl+d(n);
end;
plot(dx,p(2,:),'-ok');
hold on;
plot(dx,p(11,:),'-om');
plot(dx,p(101,:),'-oc');
%%%%%%%%%%%%%%%Explicit Solution%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
p=[p0,p,pl];
alpha=4;
dt=100;
for i=1:dt
p(i+1,1)=p0;
p(i+1,2+n)=pl;
for j=2:(n+1)
p(i+1,j)=(p(i,j-1)-(2-alpha)*p(i,j)+p(i,j+1))/alpha;
end;
end;
plot(dx,p(2,2:(n+1)),'-og');
hold on;
plot(dx,p(11,2:(n+1)),'-ob');
plot(dx,p(101,2:(n+1)),'-or');
xlabel('Distance (ft)', 'Fontsize',16);
ylabel('Pressure (psia)','Fontsize',16);
legend('Implicit dt=1','Implicit dt=10','Implicit dt=100','Explicit dt=1','Explicit dt=10','Explicit dt=100');
set(gca,'Fontsize', 12);

Решения для неявной формы следуют той же схеме, что и для явной формы, в то время как временные шаги относительно малы, а постоянная альфа достигает стабильности. Вероятно, на этих временных шагах разница настолько мала, что не влияет на форму кривой, когда явная и неявная формы решения ложатся друг на друга.

clear;
close all;
%%%%%%%%%%%%%%%Implicit Solution = 0.2%%%%%%%%%%%%%%%%%%%%%%%
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
alpha=0.2;
dt=50;
a=ones(n,1);
b=-ones(n,1)*(2+alpha);
c=ones(n,1);
d=-p*alpha;
a(1)=0;
c(n)=0;
d(1)=-p0+d(1);
d(n)=pl+d(n);
for i=1:dt
p(i+1,:)=TDMAsolver(a,b,c,d);
d=-p(i+1,:)*alpha;
d(1)=-p0+d(1);
d(n)=-pl+d(n);
end;
plot(dx,p(dt+1,:),'-ok');
hold on;
xlabel('Distance (ft)', 'Fontsize',16);
ylabel('Pressure (psia)','Fontsize',16);
%%%%%%%%%%%%%%%Implicit Solution = 0.02%%%%%%%%%%%%%%%%%%%%%%
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
alpha=0.02;
dt=5;
a=ones(n,1);
b=-ones(n,1)*(2+alpha);
c=ones(n,1);
d=-p*alpha;
a(1)=0;
c(n)=0;
d(1)=-p0+d(1);
d(n)=pl+d(n);
for i=1:dt
p(i+1,:)=TDMAsolver(a,b,c,d);
d=-p(i+1,:)*alpha;
d(1)=-p0+d(1);
d(n)=-pl+d(n);
end;
plot(dx,p(dt+1,:),'-or');
%%%%%%%%%%%%%%%Explicit Solution%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=100;
dx=10:20:2000;
p=ones(1,n)*1000;
p0=3000;
pl=1000;
p=[p0,p,pl];
alpha=4;
dt=1000;
for i=1:dt
p(i+1,1)=p0;
p(i+1,2+n)=pl;
for j=2:(n+1)
p(i+1,j)=(p(i,j-1)-(2-alpha)*p(i,j)+p(i,j+1))/alpha;
end;
end;
plot(dx,p(1001,2:(n+1)),'-ob');
xlabel('Distance (ft)', 'Fontsize',16);
ylabel('Pressure (psia)','Fontsize',16);