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.

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)

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

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

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.

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.

clc clear

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

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

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!

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

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:

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

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

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

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

© 2019. All rights reserved.