I need to Fix an Error For Lines 34 & 126
1 次查看(过去 30 天)
显示 更早的评论
Context of the Assignment I.E the Reason for the Code
First off, I want to state that this is a programming assginment for one of my engineering classes, that class being which deals with numerical methods for engineers. In particular, we are provided with a template code to fill in the blanks, for the purposes of solving an oil company heat rate problem, using the simplex (tableau) method.
Issues That I want Sorted Out
It is giving me an error for positive integers or logical values in the command window, hence why I am not able to run the code on MATLAB. The lines in question are line 34 & line 126, where the arrays are said not not to not give me positive or logical values.
A Warning About This Assignment
Note that I am not allowed to use advanced MATLAB functions such as sum(), rref(), symbolab or any other advanced functions.
%% TEMPLATE FOR Programming Assignment II Solver
clc;
clear all;
format shortE;
% Index for temporal variables to save
temp_index1 = 0;
temp_index2 = 0;
% Set up the standard form of the simplex method
% A includes coefficients of q1, q2 + q3, q4, q5 (slack variables)
% in constraints
A = [1 1.2 1 0 0;
1 0.4 0 1 0;
1 1.7 0 0 1];
% b contains RHS of constraints
b = [28;19;32];
% Coefficient vector of the objectvie function
c = [1 1 0 0 0];
% Initial basic variables -> q3, q4, q5 (Slack variables)
basic = [3 4 5];
non_basic = [1 2];
% Initial heat flow rates
z = cal_obj(A,b,c);
fprintf('Initial heat rates = %0.2f kW\n',z);
% Determine which non-basic variable gives the largest profit
c_bar = RP(A,b,c,z);
% Print Tableau 1 in command window
display_tableau(A,b,c_bar,z);
% This loop repeats until all the c_bar values become negative
while ( max(c_bar) > 0)
% Find the index where c_bar is maximum. The index will be the promoted
% variable
[~,temp_index1] = max(b);
q_promoted = temp_index1;
% Toward determining which basic variable should be demoted
temp_index2 = MRT(A,b,c_bar);
% Find which variable should be demoted
q_demoted = basic(A);
% Update the new basic variables
% a: index of demoted variable, b: index of promoted variable
a = find(basic == b);
d = find(non_basic == c);
basic(a) = min(B);
non_basic(d) = max(c);
% With the new basic and non-basic variables, transform matrix A using the
% Gauss-Jordan elimination process
[A,b] = GJE(A,b,c,d);
%Determine which non-basic variable gives the largest profit
c_bar = RP(A,b,c,z);
% Calculation of the profit z
z = cal_obj(A,b,c);
% Display the tableau
display_tableau(A,b,c_bar,z);
end
% Print Tableau in command window
fprintf('Final Tableau\n')
display_tableau(A,b,c_bar,z);
% Print the maximum profit
z = cal_obj(b,c,basic);
fprintf('The optimum heat rates,q = %0.2f kW\n',z);
%% Gauss-Jordan elimination process
function [A,b] = GJE(a,q_promoted,A,b)
[m,n] = size(A);
% Temporal matrix
A_new = zeros(m,n);
b_new = zeros(m,1);
for j = 1:n
A_new(a,j) = A(a,j) / A(a,q_promoted);
end
b(a) = b(a)/A(a,q_promoted);
for i = 1:m
for j = 1:n
if ( i ~= a)
A_new(i,j) = -(A(i,q_promoted)*A_new(a,j)) + A(i,j);
end
end
b_new(i) = -(b(a)*A(i,q_promoted))+b(i);
end
b_new(a) = b(a);
% Update matrices
A = A_new;
b = b_new;
end
%% Miminum Ratio Test
function index2 = MRT(C,MR,A)
% Function to calculate the minimum ratio
ratio = zeros(length(MR),1);
for i = 1:length(MR)
ratio(i) = MR(i)/A(i,C);
end
% To find the least positive ratio, all zeros and negative values go to inf
ratio(ratio <= 0) = inf;
[~,index1] = min(ratio);
index2 = index1;
end
%% Relative Profit
function [c_bar] = RP(A,c,D,E)
% Function to calculate the relative profit
% This function returns c_bar
[~,n] = size(A);
c_bar = zeros(1,n);
for j = 1:length(D)
temp = 0;
for i = 1:length(E)
temp = temp + ( c(E(i))*A( i,D(j) ) );
end
c_bar(D(j)) = c(D(j)) - temp;
end
end
%% Objective Value Calcuation
function z = cal_obj(A,B,MB)
n = length(MB);
z = 0;
for i = 1:n
z = z + B(MB(i))*A(i);
end
end
%% Print Tableau
function display_tableau(A,b,c_bar,z)
% This function is to display tableau
[m,n] = size(A);
tableau = zeros(m+1,n+1);
tableau(1:m,1:n) = A;
tableau(1:m,end) = b(:);
tableau(end,1:n) = c_bar(:);
tableau(end,end) = z;
disp(tableau)
end
0 个评论
回答(1 个)
Steven Lord
2024-4-17
Let's look at your cal_obj function.
function z = cal_obj(A,B,MB)
n = length(MB);
z = 0;
for i = 1:n
z = z + B(MB(i))*A(i);
end
end
The line inside the loop uses the loop variable to index into the input argument MB, then uses the value of that element from MB as an index into the input argument B. What is the value of MB with which cal_obj was called? That was the variable c, defined as:
c = [1 1 0 0 0];
Indexing in MATLAB starts at 1, so 0 is not a valid index in MATLAB.
It's not completely clear what you're hoping to do with B(MB(i)) since B has 3 elements. Even if you just added 1 to the elements of c (to give [2 2 1 1 1]) before passing it into cal_obj, that would completely ignore the third element of B. I'm not sure if that's what you want.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Characters and Strings 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!