{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 11: Minimum Variance Control" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.10: Minimum_variance_control_for_nonminimum_phase_example.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Minimum variance control for nonminimum phase example of Example 11.6 on page 416.\n", "// 11.10 \n", "\n", "exec('mv_nm.sci',-1);\n", "exec('cl.sci',-1);\n", "exec('zpowk.sci',-1);\n", "exec('polmul.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('polsplit3.sci',-1);\n", "exec('flip.sci',-1);\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "exec('poladd.sci',-1);\n", "exec('tfvar.sci',-1);\n", "exec('l2r.sci',-1);\n", "exec('transp.sci',-1);\n", "exec('tf.sci',-1);\n", "exec('covar_m.sci',-1);\n", "\n", "A = convol([1 -1],[1 -0.7]); dA = 2;\n", "B = [0.9 1]; dB = 1; k = 1;\n", "C = [1 -0.7]; dC = 1; int1 = 0;\n", "[Sc,dSc,Rc,dRc] = mv_nm(A,dA,B,dB,C,dC,k,int1);\n", "[Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", "cl(A,dA,B,dB,C,dC,k,Sc,dSc,Rc,dRc,int1);\n", "" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.11: Minimum_variance_control_of_viscosity_control_problem.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Minimum variance control of viscosity control problem\n", "// 11.11\n", "\n", "// Viscosity control problem of MacGregor\n", "\n", "exec('mv_nm.sci',-1);\n", "exec('polmul.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('zpowk.sci',-1);\n", "exec('polsplit3.sci',-1);\n", "exec('flip.sci',-1);\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "exec('cl.sci',-1);\n", "exec('poladd.sci',-1);\n", "exec('tfvar.sci',-1);\n", "exec('l2r.sci',-1);\n", "exec('transp.sci',-1);\n", "exec('tf.sci',-1);\n", "exec('covar_m.sci',-1);\n", "\n", "A = [1 -0.44]; dA = 1; B = [0.51 1.21]; dB = 1;\n", "C = [1 -0.44]; dC = 1; k = 1; int1 = 1;\n", "[Sc,dSc,Rc,dRc] = mv_nm(A,dA,B,dB,C,dC,k,int1);\n", "[Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", "cl(A,dA,B,dB,C,dC,k,Sc,dSc,Rc,dRc,int1);" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.12: General_minimum_variance_controller_design.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// General minimum variance controller design, as given by Eq. 11.66 on page 421 and Eq. 11.70 on page 422.\n", "// 11.12\n", "\n", "// function [Sc,dSc,Rc,dRc] = gmv(A,dA,B,dB,C,dC,k,rho,int)\n", "// implements the generalized minimum variance controller\n", "// if int>=1, integrated noise is assumed; otherwise,\n", "// it is not integrated noise\n", "\n", "function [Sc,dSc,R,dR] = gmv(A,dA,B,dB,C,dC,k,rho,int1)\n", "zk = zeros(1,k+1); zk(k+1) = 1;\n", "if int1>=1, [A,dA] = polmul([1 -1],1,A,dA); end\n", "[Fk,dFk,Ek,dEk] = xdync(zk,k,A,dA,C,dC);\n", "[Gk,dGk] = polmul(Ek,dEk,B,dB);\n", "alpha0 = Gk(1)/C(1); \n", "Sc = alpha0 * Fk; dSc = dFk; \n", "[R,dR] = poladd(alpha0*Gk,dGk,rho*C,dC);\n", "endfunction;" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.13: GMVC_design_of_first_example_by_MacGregor.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// GMVC design of MacGregor's first example, as discussed in Example 11.9 on page 421. \n", "// 11.13\n", "\n", "// MacGregor's first control problem by gmv\n", "\n", "exec('gmv.sci',-1);\n", "exec('cl.sci',-1);\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "exec('polmul.sci',-1);\n", "exec('zpowk.sci',-1);\n", "exec('poladd.sci',-1);\n", "exec('tfvar.sci',-1);\n", "exec('l2r.sci',-1);\n", "exec('transp.sci',-1);\n", "exec('tf.sci',-1);\n", "exec('covar_m.sci',-1);\n", "\n", "A = [1 -1.4 0.45]; dA = 2; C = [1 -0.5]; dC = 1;\n", "B = 0.5*[1 -0.9]; dB = 1; k = 1; int1 = 0;\n", "rho = 1;\n", "[Sc,dSc,Rc,dRc] = gmv(A,dA,B,dB,C,dC,k,rho,int1);\n", "[Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", " cl(A,dA,B,dB,C,dC,k,Sc,dSc,Rc,dRc,int1);" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.14: GMVC_design_of_viscosity_problem.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// GMVC design of viscosity problem, as described in Example 11.10 on page 423.\n", "// 11.14\n", "\n", "// MacGregor's Viscosity control problem by gmv\n", "\n", "exec('gmv.sci',-1);\n", "exec('cl.sci',-1);\n", "exec('polmul.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "exec('poladd.sci',-1);\n", "exec('zpowk.sci',-1);\n", "exec('tfvar.sci',-1);\n", "exec('l2r.sci',-1);\n", "exec('transp.sci',-1);\n", "exec('tf.sci',-1);\n", "exec('covar_m.sci',-1);\n", "\n", "A = [1 -0.44]; dA = 1; B = [0.51 1.21]; dB = 1;\n", "C = [1 -0.44]; dC = 1; k = 1; int1 = 1;\n", "rho = 1;\n", "[Sc,dSc,R1,dR1] = gmv(A,dA,B,dB,C,dC,k,rho,int1);\n", "[Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", " cl(A,dA,B,dB,C,dC,k,Sc,dSc,R1,dR1,int1);\n", "" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.15: PID_tuning_through_GMVC_law.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// PID tuning through GMVC law, as discussed in Example 11.11.\n", "// 11.15\n", "\n", "exec('gmvc_pid.sci',-1);\n", "exec('zpowk.sci',-1);\n", "exec('ch_pol.sci',-1);\n", "exec('polmul.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "exec('filtval.sci',-1);\n", "exec('polyno.sci',-1);\n", "\n", "// GMVC PID tuning of example given by Miller et al.\n", "// Model\n", "A = [1 -1.95 0.935]; B = -0.015; k = 1; Ts = 1;\n", "\n", "// Transient specifications\n", "N = 15; epsilon = 0.1;\n", "T = ch_pol(N,epsilon);\n", "\n", "// Controller Design\n", "[Kc,tau_i,tau_d,L] = gmvc_pid(A,B,k,T,Ts);\n", "L1 = filtval(L,1);\n", "zk = zpowk(k);\n", "\n", "" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.16: Value_of_polynomial_p_evaluated_at_x.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Value of polynomial p(x), evaluated at x\n", "// 11.16\n", "\n", "// finds the value of a polynomial in powers of z^{-1}\n", "// function Y = filtval(P,z)\n", "\n", "function Y = filtval(P,z)\n", "N = length(P)-1;\n", "Q = polyno(P,'x');\n", "Y = horner(Q,z)/z^N; \n", "endfunction;" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.17: PID_tuning_through_GMVC_law.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// PID tuning through GMVC law\n", "// 11.17\n", "\n", "// function [Kc,tau_i,tau_d,L] = gmvc_pid(A,B,k,T,Ts)\n", "// Determines p,i,d tuning parameters using GMVC\n", "// Plant model: Integrated white noise\n", "// A, B in discrete time form\n", "\n", "function [Kc,tau_i,tau_d,L] = gmvc_pid(A,B,k,T,Ts)\n", "\n", "dA = length(A)-1; dB = length(B)-1;\n", "dT = length(T)-1;\n", "if dA > 2,\n", " disp('degree of A cannot be more than 2')\n", " exit\n", "elseif dB > 1,\n", " disp('degree of B cannot be more than 1')\n", " exit\n", "elseif dT > 2,\n", " disp('degree of T cannot be more than 2')\n", " exit\n", "end\n", "delta = [1 -1]; ddelta = 1;\n", "\n", "[Adelta,dAdelta] = polmul(A,dA,delta,ddelta);\n", "\n", "[Q,dQ,P,dP] = ...\n", "xdync(Adelta,dAdelta,B,dB,T,dT);\n", "PAdelta = P(1)*Adelta;\n", "\n", "[zk,dzk] = zpowk(k);\n", "[E,degE,F,degF] = ...\n", "xdync(PAdelta,dAdelta,zk,dzk,P,dP);\n", "nu = P(1)*E(1)*B(1);\n", "Kc = -1/nu*(F(2)+2*F(3));\n", "tau_i = -(F(2)+2*F(3))/(F(1)+F(2)+F(3))*Ts;\n", "tau_d = -F(3)/(F(2)+2*F(3))*Ts;\n", "L(1) = 1+Ts/tau_i+tau_d/Ts;\n", "L(2) = -(1+2*tau_d/Ts);\n", "L(3) = tau_d/Ts;\n", "L = Kc * L';\n", "endfunction;" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.1: Recursive_computation_of_Ej_and_Fj.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Recursive computation of Ej and Fj\n", "// 11.1\n", "\n", "function [Fj,dFj,Ej,dEj] = recursion(A,dA,C,dC,j)\n", "Fo = C; dFo = dC;\n", "Eo = 1; dEo = 0;\n", "A_z = A(2:dA+1); dA_z = dA-1;\n", "zi = 1; dzi = 0;\n", "for i = 1:j-1\n", " if (dFo == 0)\n", " Fn1 = 0;\n", " else\n", " Fn1 = Fo(2:(dFo+1));\n", " end\n", " dFn1 = max(dFo-1,0);\n", " Fn2 = -Fo(1)*A_z; dFn2 = dA-1;\n", " [Fn,dFn] = poladd(Fn1,dFn1,Fn2,dFn2);\n", " zi = convol(zi,[0,1]); dzi = dzi + 1;\n", " En2 = Fn(1)*zi; dEn2 = dzi;\n", " [En,dEn] = poladd(Eo,dEo,En2,dEn2);\n", " Eo = En; Fo = Fn;\n", " dEo = dEn; dFo = dFn;\n", "end\n", "if (dFo == 0)\n", " Fn1 = 0;\n", "else\n", "Fn1 = Fo(2:(dFo+1));\n", "end;\n", "dFn1 = max(dFo-1,0);\n", "Fn2 = -Fo(1)*A_z; dFn2 = dA-1;\n", "[Fn,dFn] = poladd(Fn1,dFn1,Fn2,dFn2);\n", "Fj = Fn; dFj = dFn;\n", "Ej = Eo; dEj = dEo;\n", "endfunction;\n", "" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.2: Recursive_computation_of_Ej_and_Fj_for_the_system_presented_in_Example.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Recursive computation of Ej and Fj for the system presented in Example 11.2 on page 408.\n", "// 11.2\n", "\n", "exec('poladd.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('recursion.sci',-1);\n", "\n", "C = [1 0.5]; dC = 1;\n", "A = [1 -0.6 -0.16]; dA = 2;\n", "j = 2;\n", "[Fj,dFj,Ej,dEj] = recursion(A,dA,C,dC,j)\n", "" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.3: Solution_of_Aryabhatta_identity.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Solution of Aryabhatta's identity Eq. 11.8, as discussed in Example 11.3 on page 409.\n", "// 11.3\n", "\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "\n", "C = [1 0.5]; dC = 1; j=2;\n", "A = [1 -0.6 -0.16]; dA = 2;\n", "zj = zeros(1,j+1); zj(j+1) = 1;\n", "[Fj,dFj,Ej,dEj] = xdync(zj,j,A,dA,C,dC)" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.4: 1st_control_problem_by_MacGregor.sce" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// MacGregor's first control problem, discussed in Example 11.4 on page 213.\n", "// 11.4\n", "\n", "exec('mv.sci',-1);\n", "exec('cl.sci',-1);\n", "exec('cosfil_ip.sci',-1);\n", "exec('zpowk.sci',-1);\n", "exec('xdync.sci',-1);\n", "exec('rowjoin.sci',-1);\n", "exec('polsize.sci',-1);\n", "exec('left_prm.sci',-1);\n", "exec('t1calc.sci',-1);\n", "exec('indep.sci',-1);\n", "exec('seshft.sci',-1);\n", "exec('makezero.sci',-1);\n", "exec('move_sci.sci',-1);\n", "exec('colsplit.sci',-1);\n", "exec('clcoef.sci',-1);\n", "exec('cindep.sci',-1);\n", "exec('polmul.sci',-1);\n", "exec('poladd.sci',-1);\n", "exec('tfvar.sci',-1);\n", "exec('l2r.sci',-1);\n", "exec('transp.sci',-1);\n", "exec('tf.sci',-1);\n", "exec('covar_m.sci',-1);\n", "exec('polyno.sci',-1);\n", "\n", "// MacGregor's first control problem\n", "A = [1 -1.4 0.45]; dA = 2; C = [1 -0.5]; dC = 1;\n", "B = 0.5*[1 -0.9]; dB = 1; k = 1; int1 = 0;\n", "[Sc,dSc,Rc,dRc] = mv(A,dA,B,dB,C,dC,k,int1);\n", "[Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", "cl(A,dA,B,dB,C,dC,k,Sc,dSc,Rc,dRc,int1);\n", "\n", "// Simulation parameters for stb_disc.xcos\n", "Tc = Sc; gamm = 1; [zk,dzk] = zpowk(k);\n", "D = 1; N_var = 1; Ts = 1; st = 0; \n", "t_init = 0; t_final = 1000;\n", "\n", "[Tcp1,Tcp2] = cosfil_ip(Tc,1); // Tc/1\n", "[Rcp1,Rcp2] = cosfil_ip(1,Rc); // 1/Rc\n", "[Scp1,Scp2] = cosfil_ip(Sc,1); // Sc/1\n", "[Bp,Ap] = cosfil_ip(B,A); // B/A\n", "[zkp1,zkp2] = cosfil_ip(zk,1); // zk/1\n", "[Cp,Dp] = cosfil_ip(C,D); // C/D\n", "\n", "" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.5: Minimum_variance_control_law_design.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Minimum variance control law design, given by Eq. 11.40 on page 413. \n", "// 11.5\n", "\n", "// function [S,dS,R,dR] = mv(A,dA,B,dB,C,dC,k,int)\n", "// implements the minimum variance controller\n", "// if int>=1, integrated noise is assumed; otherwise,\n", "// it is not integrated noise\n", "\n", "function [S,dS,R,dR] = mv(A,dA,B,dB,C,dC,k,int1)\n", "zk = zeros(1,k+1); zk(k+1) = 1;\n", "if int1>=1, [A,dA] = polmul([1 -1],1,A,dA); end\n", "[Fk,dFk,Ek,dEk] = xdync(zk,k,A,dA,C,dC);\n", "\n", "[Gk,dGk] = polmul(Ek,dEk,B,dB);\n", "S = Fk; dS = dFk; R = Gk; dR = dGk;\n", "endfunction;" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.6: Calculation_of_closed_loop_transfer_functions.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Calculation of closed loop transfer functions\n", "// 11.6\n", "\n", "// function [Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", "// cl(A,dA,B,dB,C,dC,k,S,dS,R,dR,int)\n", "// int>=1 means integrated noise and control law:\n", "// delta u = - (S/R)y\n", "// Evaluates the closed loop transfer function and \n", "// variances of input and output\n", "\n", "function [Nu,dNu,Du,dDu,Ny,dNy,Dy,dDy,yvar,uvar] = ...\n", " cl(A,dA,B,dB,C,dC,k,S,dS,R,dR,int1)\n", "[zk,dzk] = zpowk(k);\n", "\n", "[BS,dBS] = polmul(B,dB,S,dS);\n", "[zBS,dzBS] = polmul(zk,dzk,BS,dBS);\n", "[RA,dRA] = polmul(R,dR,A,dA);\n", "if int1>=1, [RA,dRA] = polmul(RA,dRA,[1 -1],1); end\n", "\n", "[D,dD] = poladd(RA,dRA,zBS,dzBS);\n", "\n", "[Ny,dNy] = polmul(C,dC,R,dR);\n", "[Nu,dNu] = polmul(C,dC,S,dS);\n", "\n", "[Nu,dNu,Du,dDu,uvar] = tfvar(Nu,dNu,D,dD);\n", "[Ny,dNy,Dy,dDy,yvar] = tfvar(Ny,dNy,D,dD);\n", "\n", "endfunction;" ] } , { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 11.7: Cancellation_of_common_factors_and_determination_of_covariance.sci" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "// Cancellation of common factors and determination of covariance\n", "// 11.7\n", "\n", "// function [N,dN,D,dD,yvar] = tfvar(N,dN,D,dD)\n", "// N and D polynomials in z^{-1} form; discrete case\n", "\n", "function [N,dN,D,dD,yvar] = tfvar(N,dN,D,dD)\n", "\n", "[N,dN,D,dD] = l2r(N,dN,D,dD);\n", "N = N/D(1); D = D/D(1);\n", "LN = length(N); LD = length(D); \n", "D1 = D;\n", "if LD=1, integrated noise is assumed; otherwise,\n", "// it is not integrated noise\n", "\n", "function [Sc,dSc,Rc,dRc] = mv_nm(A,dA,B,dB,C,dC,k,int1)\n", "if int1>=1, [A,dA] = polmul([1 -1],1,A,dA); end\n", "[zk,dzk] = zpowk(k);\n", "[Bzk,dBzk] = polmul(B,dB,zk,dzk);\n", "[Bg,Bb] = polsplit3(B); Bbr = flip(Bb);\n", "RHS = convol(C,convol(Bg,Bbr)); dRHS = length(RHS)-1;\n", "[Sc,dSc,Rc,dRc] = xdync(Bzk,dBzk,A,dA,RHS,dRHS);\n", "endfunction;" ] } ], "metadata": { "kernelspec": { "display_name": "Scilab", "language": "scilab", "name": "scilab" }, "language_info": { "file_extension": ".sce", "help_links": [ { "text": "MetaKernel Magics", "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" } ], "mimetype": "text/x-octave", "name": "scilab", "version": "0.7.1" } }, "nbformat": 4, "nbformat_minor": 0 }