Lesson: Converting from Matlab to Python


Task 1: Comparison

It is not terribly difficult to recreate a MATLAB code in python. Python scripts may be written in any text editor (such as notepad), and run on a linux machine. This lesson will teach you how to translate an fsolve script from Matlab to python. For running the python script, please see the next lesson.

The following is an example of a MATLAB fsolve script that has been translated into python. This figure may be useful in understanding the rest of the lesson.

Matlab Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
% Solution to part 2 of Murphy P4.40

clc
clear

% unknown vector
%   x = [ n2  xG,2  xW,2  xCO2,2  xH2,2  xi ]

% define vector function containing 4 MBs, 1 AUX equilibrium
% relationship, and 1 AUX constraint on mole fractions summing to 1

F =@ (x) [ 1.630 - x(2)*x(1) - x(6);                    % G MB
           8.152 - x(3)*x(1) - 3*x(6);                  % W MB
           0 - x(4)*x(1) + 3*x(6);                      % CO2 MB
           0 - x(5)*x(1) + 7*x(6);                      % H2 MB
           x(4)^3*x(5)^7 - 55*x(2)*x(3)^3/(1.2)^6;      % AUX 1
           x(2) + x(3) + x(4) + x(5) - 1 ];             % AUX 2
       

% We have defined a set of equations for the six unknowns. Need to
% supply an initial guess for each unknown quantity.

x0 = [ 15  0.1  0.1  0.2  0.6 3 ];

% Solve
options = optimset('display', 'off');

x = fsolve(F, x0, options);

fprintf('\n Mole fraction of H2 at exit: %6.4f\n', x(5))

% fractional conversion of glycerine: (in - out)/in
nG1 = 1.630;                                % gmol/h
fc = (nG1 - x(2)*x(1))/nG1;
fprintf(' Fractional conversion of glycerine: %5.3f\n', fc)

Python Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from scipy.optimize import fsolve

# unknown vector
#   x = [ n2  xG,2  xW,2  xCO2,2  xH2,2  xi ]
# define vector function containing 4 MBs, 1 AUX equilibrium
# relationship, and 1 AUX constraint on mole fractions summing to 1

def F(x):
  return [ 1.630 - x[1]*x[0] - x[5],                    # G MB
           8.152 - x[2]*x[0] - 3*x[5],                  # W MB
           0 - x[3]*x[0] + 3*x[5],                      # CO2 MB
           0 - x[4]*x[0] + 7*x[5],                      # H2 MB
           x[3]**3*x[4]**7 - 55*x[1]*x[2]**3/(1.2)**6,  # AUX 1
           x[1] + x[2] + x[3] + x[4] - 1 ]              # AUX 2
       

# We have defined a set of equations for the six unknowns. Need to
# supply an initial guess for each unknown quantity.
x0 = [ 15,  0.1,  0.1,  0.2,  0.6, 3 ]

# Solve
x = fsolve(F, x0)

print '\n Mole fraction of H2 at exit: %6.4f\n' %  x[4]

# fractional conversion of glycerine: (in - out)/in
nG1 = 1.630 #  % gmol/h
fc = (nG1 - x[1]*x[0])/nG1
print ' Fractional conversion of glycerine: %5.3f\n' % fc

Task 2: Things in Python but not Matlab

Python imports code at the beginning. This is essential for using fsolve and some other functions. Notice the following line:

In Python

1
from scipy.optimize import fsolve

This line tells python to import fsolve; it is equivalent to telling a student to bring a calculator to class. Python requires this reminder.


Task 3: Things in Matlab but not Python

Matlab requires clc and clear to empty the workspace. It also uses semicolons to suppress output. Python does not need these things--it is automatically suppressed, and it starts fresh every time the script is run.

Uneccessary in Python

clc
clear

Task 4: Things that are different in Python

There are several things that are changed when converting from Matlab to Python. The most basic are:

Python

           8.152 - x[2]*x[0] - 3*x[5],                  # W MB

Vs Matlab

           8.152 - x(3)*x(1) - 3*x(6);                  % W MB

Function definition in python is slightly different. def is used instead of @, and python requires the return statement. Instead of semicolons, python just uses commas to separate the rows in a matrix. Finally, it is extremely important that the indexing is changed to start at 0 instead of 1!

Python

10
11
12
13
14
15
16
def F(x):
  return [ 1.630 - x[1]*x[0] - x[5],                    # G MB
           8.152 - x[2]*x[0] - 3*x[5],                  # W MB
           0 - x[3]*x[0] + 3*x[5],                      # CO2 MB
           0 - x[4]*x[0] + 7*x[5],                      # H2 MB
           x[3]**3*x[4]**7 - 55*x[1]*x[2]**3/(1.2)**6,  # AUX 1
           x[1] + x[2] + x[3] + x[4] - 1 ]              # AUX 2

Vs Matlab

12
13
14
15
16
17
F =@ (x) [ 1.630 - x(2)*x(1) - x(6);                    % G MB
           8.152 - x(3)*x(1) - 3*x(6);                  % W MB
           0 - x(4)*x(1) + 3*x(6);                      % CO2 MB
           0 - x(5)*x(1) + 7*x(6);                      % H2 MB
           x(4)^3*x(5)^7 - 55*x(2)*x(3)^3/(1.2)^6;      % AUX 1
           x(2) + x(3) + x(4) + x(5) - 1 ];             % AUX 2

The last difference comes in displaying answers. The fprintf statement in MATLAB and the print statement in python have slightly different syntax. Note the differences below:

In Python

print ' Fractional conversion of glycerine: %5.3f\n' % fc

Vs Matlab

fprintf(' Fractional conversion of glycerine: %5.3f\n', fc)

Task 5: Review

These are all the things that need to be changed. To review:

These changes should allow a MATLAB script to be run in python.