How to use the output of a function as the same function input?
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Hello everyone, I coded the two phase simplex method, and created a function called TwoPhaseSimplex() that turns [row,column] selected point to tableau. However, I want to use the output of a function as the same function input. For example,
function [Tableau]=TwoPhaseSimplex(x,y) and I have entered first x y values, the function gives me first output. Furthermore, I want to enter second x,y values but by using function's first output. I insert the code I write:
clear,clc
%%
A=[1 -7.5 0 0 -1 0 0 0 1 0 0;3 1 8 -8 0 -1 0 0 0 1 0;-10 5 -7 7 0 0 1 0 0 0 0;0 -1 5 -5 0 0 0 -1 0 0 1];
b=[2 5 4.5 1.5];
f=[1 -1 2 -2];
w=[-4 7.5 -13 13 1 1 0 1 0 0 0 0];
Tableau=[A b';f zeros(1,8);w]
%% Iterations
TwoPhaseSimplex(4,3)
TwoPhaseSimplex(2,1)
%% Function for Iteration
function [T]=TwoPhaseSimplex(row,column)
A=[1 -7.5 0 0 -1 0 0 0 1 0 0;3 1 8 -8 0 -1 0 0 0 1 0;-10 5 -7 7 0 0 1 0 0 0 0;0 -1 5 -5 0 0 0 -1 0 0 1];
b=[2 5 4.5 1.5];
f=[1 -1 2 -2];
w=[-4 7.5 -13 13 1 1 0 1 0 0 0 0];
Tableau=[A b';f zeros(1,8);w];
%[row1, column1] = find(w == min(w));
row1=row;
column1=column;
for i=1
ratio(1,i)=b(i)/A(i,column1);
end
for i=2
ratio(1,i)=b(i)/A(i,column1);
end
for i=3
ratio(1,i)=b(i)/A(i,column1);
end
for i=4
ratio(1,i)=b(i)/A(i,column1);
end
[row2, column2] = find(ratio == min(ratio(ratio>0)));
%A(column2,column1);
%A(column2,:)/A(column2,column1);
Tableau(column2,column1);
%Tableau(column2,:)/Tableau(column2,column1);
if column2==1
T1=Tableau(column2,:)/Tableau(column2,column1);
T2=Tableau(2,:)-Tableau(2,column1)*Tableau(column2,:)/Tableau(column2,column1);
T3=Tableau(3,:)-Tableau(3,column1)*Tableau(column2,:)/Tableau(column2,column1);
T4=Tableau(4,:)-Tableau(4,column1)*Tableau(column2,:)/Tableau(column2,column1);
T5=Tableau(5,:)-Tableau(5,column1)*Tableau(column2,:)/Tableau(column2,column1);
T6=Tableau(6,:)-Tableau(6,column1)*Tableau(column2,:)/Tableau(column2,column1);
end
if column2==2
T1=Tableau(1,:)-Tableau(1,column1)*Tableau(column2,:)/Tableau(column2,column1);
T2=Tableau(column2,:)/Tableau(column2,column1);
T3=Tableau(3,:)-Tableau(3,column1)*Tableau(column2,:)/Tableau(column2,column1);
T4=Tableau(4,:)-Tableau(4,column1)*Tableau(column2,:)/Tableau(column2,column1);
T5=Tableau(5,:)-Tableau(5,column1)*Tableau(column2,:)/Tableau(column2,column1);
T6=Tableau(6,:)-Tableau(6,column1)*Tableau(column2,:)/Tableau(column2,column1);
end
if column2==3
T1=Tableau(1,:)-Tableau(1,column1)*Tableau(column2,:)/Tableau(column2,column1);
T2=Tableau(2,:)-Tableau(2,column1)*Tableau(column2,:)/Tableau(column2,column1);
T3=Tableau(column2,:)/Tableau(column2,column1);
T4=Tableau(4,:)-Tableau(4,column1)*Tableau(column2,:)/Tableau(column2,column1);
T5=Tableau(5,:)-Tableau(5,column1)*Tableau(column2,:)/Tableau(column2,column1);
T6=Tableau(6,:)-Tableau(6,column1)*Tableau(column2,:)/Tableau(column2,column1);
end
if column2==4
T1=Tableau(1,:)-Tableau(1,column1)*Tableau(column2,:)/Tableau(column2,column1);
T2=Tableau(2,:)-Tableau(2,column1)*Tableau(column2,:)/Tableau(column2,column1);
T3=Tableau(3,:)-Tableau(3,column1)*Tableau(column2,:)/Tableau(column2,column1);
T4=Tableau(column2,:)/Tableau(column2,column1);
T5=Tableau(5,:)-Tableau(5,column1)*Tableau(column2,:)/Tableau(column2,column1);
T6=Tableau(6,:)-Tableau(6,column1)*Tableau(column2,:)/Tableau(column2,column1);
end
%{
T1=Tableau(1,:)-Tableau(1,column1)*Tableau(column2,:)/Tableau(column2,column1);
T2=Tableau(2,:)-Tableau(2,column1)*Tableau(column2,:)/Tableau(column2,column1);
T3=Tableau(3,:)-Tableau(3,column1)*Tableau(column2,:)/Tableau(column2,column1);
T4=Tableau(4,:)-Tableau(4,column1)*Tableau(column2,:)/Tableau(column2,column1);
T5=Tableau(5,:)-Tableau(5,column1)*Tableau(column2,:)/Tableau(column2,column1);
T6=Tableau(6,:)-Tableau(6,column1)*Tableau(column2,:)/Tableau(column2,column1);
%}
display('Iteration')
Tableau_new=[T1;T2;T3;T4;T5;T6];
A_new=Tableau_new(1:4,1:11);
b_new=Tableau_new(:,12);
T= array2table(Tableau_new,'VariableNames',{'x1','x2','x3','x4','x5','x6','x7','x8','x9','x10','x11','b'});
f_new=Tableau_new(5,:);
w_new=Tableau_new(6,:);
end
Thanks a lot
0 comentarios
Respuestas (1)
Jamal Nasir
el 14 de Abr. de 2020
you can use for statement or while as follow
x=initial_Value
y=[];
for i=1:NoIteration
[a,b]=func(x)
y=[y;a,b];
x=[a,b]; %%using as input for next iteration
end
2 comentarios
Jamal Nasir
el 18 de Abr. de 2020
when you call function the input size should be have fixed sized
you should re-arrange your output to be same size of input depend on your problem
and got the fixed sized each iterartions
thanks
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!