From 0833009e483b6a52fa0eefd70812f69fd7adcabe Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Wed, 22 Jan 2020 18:19:40 +0100 Subject: [PATCH] Initialize Stewart platform in the wanted position --- .../environment.loadSimulink.type.Command.xml | 2 +- active-damping.org | 3 + control-study.org | 13 +- cubic-configuration.org | 22 +- dynamics-study.org | 36 ++- simscape-model.org | 153 +++++---- simscape_subsystems/stewart_strut.slx | Bin 31135 -> 31590 bytes simulink/stewart_platform_dynamics.slx | Bin 28383 -> 28543 bytes src/initializeStewartPose.m | 27 ++ stiffness-study.html | 294 ------------------ stiffness-study.org | 41 --- 11 files changed, 171 insertions(+), 420 deletions(-) create mode 100644 src/initializeStewartPose.m delete mode 100644 stiffness-study.html delete mode 100644 stiffness-study.org diff --git a/.SimulinkProject/Root.type.EnvironmentCustomizations/environment.loadSimulink.type.Command.xml b/.SimulinkProject/Root.type.EnvironmentCustomizations/environment.loadSimulink.type.Command.xml index 08fab53..6dbc40c 100644 --- a/.SimulinkProject/Root.type.EnvironmentCustomizations/environment.loadSimulink.type.Command.xml +++ b/.SimulinkProject/Root.type.EnvironmentCustomizations/environment.loadSimulink.type.Command.xml @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/active-damping.org b/active-damping.org index b5bf2c2..24c18ac 100644 --- a/active-damping.org +++ b/active-damping.org @@ -45,7 +45,10 @@ stewart = generateCubicConfiguration(stewart, 'Hc', 40e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); #+end_src ** Identification of the Dynamics diff --git a/control-study.org b/control-study.org index 22949aa..547cbdc 100644 --- a/control-study.org +++ b/control-study.org @@ -69,17 +69,14 @@ ** Initialize the Stewart platform #+begin_src matlab - stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); - % stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3); + stewart = initializeFramesPositions(); stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); - stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeStrutDynamics(stewart); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); -#+end_src - -** Initialize the Simulation -#+begin_src matlab - load('mat/conf_simscape.mat'); + stewart = initializeStewartPose(stewart); #+end_src ** Identification of the plant diff --git a/cubic-configuration.org b/cubic-configuration.org index 8b07ad0..da10245 100644 --- a/cubic-configuration.org +++ b/cubic-configuration.org @@ -53,7 +53,7 @@ The goal is to study the benefits of using a cubic configuration: - No coupling between the actuators? - Is the center of the cube an important point? -* Configuration Analysis - Stiffness Matrix +* TODO Configuration Analysis - Stiffness Matrix ** Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center We create a cubic Stewart platform (figure [[fig:3d-cubic-stewart-aligned]]) in such a way that the center of the cube (black dot) is located at the center of the Stewart platform (blue dot). The Jacobian matrix is estimated at the location of the center of the cube. @@ -228,7 +228,7 @@ We obtain $k_x = k_y = k_z$ and $k_{\theta_x} = k_{\theta_y}$, but the Stiffness - The stiffness matrix $K$ is diagonal for the cubic configuration if the Stewart platform and the cube are centered *and* the Jacobian is estimated at the cube center #+end_important -* Cubic size analysis +* TODO Cubic size analysis We here study the effect of the size of the cube used for the Stewart configuration. We fix the height of the Stewart platform, the center of the cube is at the center of the Stewart platform. @@ -304,14 +304,14 @@ We observe that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ increase linear In that case, the legs will the further separated. Size of the cube is then limited by allowed space. #+end_important -* initializeCubicConfiguration - :PROPERTIES: - :HEADER-ARGS:matlab+: :exports code - :HEADER-ARGS:matlab+: :comments no - :HEADER-ARGS:matlab+: :eval no - :HEADER-ARGS:matlab+: :tangle src/initializeCubicConfiguration.m - :END: - <> +* TODO initializeCubicConfiguration +:PROPERTIES: +:HEADER-ARGS:matlab+: :exports code +:HEADER-ARGS:matlab+: :comments no +:HEADER-ARGS:matlab+: :eval no +:HEADER-ARGS:matlab+: :tangle src/initializeCubicConfiguration.m +:END: +<> ** Function description #+begin_src matlab @@ -449,7 +449,7 @@ And the location of the joints on the mobile platform with respect to $\{B\}$. end #+end_src -* Tests +* TODO Tests ** First attempt to parametrisation #+name: fig:stewart_bottom_plate #+caption: Schematic of the bottom plates with all the parameters diff --git a/dynamics-study.org b/dynamics-study.org index fca28df..cde371d 100644 --- a/dynamics-study.org +++ b/dynamics-study.org @@ -41,11 +41,14 @@ ** test #+begin_src matlab - stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); - stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3); + stewart = initializeFramesPositions(); + stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); - stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeStrutDynamics(stewart); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); #+end_src Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$: @@ -126,11 +129,14 @@ Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}} ** Compare external forces and forces applied by the actuators Initialization of the Stewart platform. #+begin_src matlab - stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); - stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3); + stewart = initializeFramesPositions(); + stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); - stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeStrutDynamics(stewart); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); #+end_src Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$: @@ -188,11 +194,14 @@ Seems quite similar. ** Comparison of the static transfer function and the Compliance matrix Initialization of the Stewart platform. #+begin_src matlab - stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); - stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3); + stewart = initializeFramesPositions(); + stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); - stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeStrutDynamics(stewart); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); #+end_src Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$: @@ -248,11 +257,14 @@ The low frequency transfer function matrix from $\mathcal{\bm{F}}$ to $\mathcal{ ** Transfer function from forces applied in the legs to the displacement of the legs Initialization of the Stewart platform. #+begin_src matlab - stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); - stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3); + stewart = initializeFramesPositions(); + stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); - stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeStrutDynamics(stewart); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); #+end_src Estimation of the transfer function from $\bm{\tau}$ to $\bm{L}$: diff --git a/simscape-model.org b/simscape-model.org index 82c1031..30675e7 100644 --- a/simscape-model.org +++ b/simscape-model.org @@ -106,8 +106,11 @@ By following this procedure, we obtain a Matlab structure =stewart= that contain stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); + stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart, 'AP', [0;0;0.01], 'ARB', eye(3)); + [Li, dLi] = inverseKinematics(stewart, 'AP', [0;0;0.00001], 'ARB', eye(3)); [P, R] = forwardKinematicsApprox(stewart, 'dL', dLi); #+end_src @@ -268,8 +271,6 @@ This Matlab function is accessible [[file:src/generateGeneralConfiguration.m][he % Syntax: [stewart] = generateGeneralConfiguration(stewart, args) % % Inputs: - % - stewart - A structure with the following fields - % - H [1x1] - Total height of the platform [m] % - args - Can have the following fields: % - FH [1x1] - Height of the position of the fixed joints with respect to the frame {F} [m] % - FR [1x1] - Radius of the position of the fixed joints in the X-Y [m] @@ -477,6 +478,81 @@ This Matlab function is accessible [[file:src/computeJacobian.m][here]]. #+end_src * Initialize the Geometry of the Mechanical Elements +** =initializeCylindricalPlatforms=: Initialize the geometry of the Fixed and Mobile Platforms +:PROPERTIES: +:header-args:matlab+: :tangle src/initializeCylindricalPlatforms.m +:header-args:matlab+: :comments none :mkdirp yes :eval no +:END: +<> + +This Matlab function is accessible [[file:src/initializeCylindricalPlatforms.m][here]]. + +*** Function description +#+begin_src matlab + function [stewart] = initializeCylindricalPlatforms(stewart, args) + % initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms + % + % Syntax: [stewart] = initializeCylindricalPlatforms(args) + % + % Inputs: + % - args - Structure with the following fields: + % - Fpm [1x1] - Fixed Platform Mass [kg] + % - Fph [1x1] - Fixed Platform Height [m] + % - Fpr [1x1] - Fixed Platform Radius [m] + % - Mpm [1x1] - Mobile Platform Mass [kg] + % - Mph [1x1] - Mobile Platform Height [m] + % - Mpr [1x1] - Mobile Platform Radius [m] + % + % Outputs: + % - stewart - updated Stewart structure with the added fields: + % - platforms [struct] - structure with the following fields: + % - Fpm [1x1] - Fixed Platform Mass [kg] + % - Msi [3x3] - Mobile Platform Inertia matrix [kg*m^2] + % - Fph [1x1] - Fixed Platform Height [m] + % - Fpr [1x1] - Fixed Platform Radius [m] + % - Mpm [1x1] - Mobile Platform Mass [kg] + % - Fsi [3x3] - Fixed Platform Inertia matrix [kg*m^2] + % - Mph [1x1] - Mobile Platform Height [m] + % - Mpr [1x1] - Mobile Platform Radius [m] +#+end_src + +*** Optional Parameters +#+begin_src matlab + arguments + stewart + args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3 + args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 125e-3 + args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3 + args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 + end +#+end_src + +*** Create the =platforms= struct +#+begin_src matlab + platforms = struct(); + + platforms.Fpm = args.Fpm; + platforms.Fph = args.Fph; + platforms.Fpr = args.Fpr; + platforms.Fpi = diag([1/12 * platforms.Fpm * (3*platforms.Fpr^2 + platforms.Fph^2), ... + 1/12 * platforms.Fpm * (3*platforms.Fpr^2 + platforms.Fph^2), ... + 1/2 * platforms.Fpm * platforms.Fpr^2]); + + platforms.Mpm = args.Mpm; + platforms.Mph = args.Mph; + platforms.Mpr = args.Mpr; + platforms.Mpi = diag([1/12 * platforms.Mpm * (3*platforms.Mpr^2 + platforms.Mph^2), ... + 1/12 * platforms.Mpm * (3*platforms.Mpr^2 + platforms.Mph^2), ... + 1/2 * platforms.Mpm * platforms.Mpr^2]); +#+end_src + +*** Save the =platforms= struct +#+begin_src matlab + stewart.platforms = platforms; +#+end_src + ** =initializeCylindricalStruts=: Define the mass and moment of inertia of cylindrical struts :PROPERTIES: :header-args:matlab+: :tangle src/initializeCylindricalStruts.m @@ -556,79 +632,50 @@ This Matlab function is accessible [[file:src/initializeCylindricalStruts.m][her stewart.struts = struts; #+end_src -** =initializeCylindricalPlatforms=: Initialize the geometry of the Fixed and Mobile Platforms +* =initializeStewartPose=: Determine the initial stroke in each leg to have the wanted pose :PROPERTIES: -:header-args:matlab+: :tangle src/initializeCylindricalPlatforms.m +:header-args:matlab+: :tangle src/initializeStewartPose.m :header-args:matlab+: :comments none :mkdirp yes :eval no :END: -<> +<> -This Matlab function is accessible [[file:src/initializeCylindricalPlatforms.m][here]]. +This Matlab function is accessible [[file:src/initializeStewartPose.m][here]]. -*** Function description +** Function description #+begin_src matlab - function [stewart] = initializeCylindricalPlatforms(stewart, args) - % initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms + function [stewart] = initializeStewartPose(stewart, args) + % initializeStewartPose - Determine the initial stroke in each leg to have the wanted pose + % It uses the inverse kinematic % - % Syntax: [stewart] = initializeCylindricalPlatforms(args) + % Syntax: [stewart] = initializeStewartPose(stewart, args) % % Inputs: - % - args - Structure with the following fields: - % - Fpm [1x1] - Fixed Platform Mass [kg] - % - Fph [1x1] - Fixed Platform Height [m] - % - Fpr [1x1] - Fixed Platform Radius [m] - % - Mpm [1x1] - Mobile Platform Mass [kg] - % - Mph [1x1] - Mobile Platform Height [m] - % - Mpr [1x1] - Mobile Platform Radius [m] + % - stewart - A structure with the following fields + % - Aa [3x6] - The positions ai expressed in {A} + % - Bb [3x6] - The positions bi expressed in {B} + % - args - Can have the following fields: + % - AP [3x1] - The wanted position of {B} with respect to {A} + % - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A} % % Outputs: % - stewart - updated Stewart structure with the added fields: - % - platforms [struct] - structure with the following fields: - % - Fpm [1x1] - Fixed Platform Mass [kg] - % - Msi [3x3] - Mobile Platform Inertia matrix [kg*m^2] - % - Fph [1x1] - Fixed Platform Height [m] - % - Fpr [1x1] - Fixed Platform Radius [m] - % - Mpm [1x1] - Mobile Platform Mass [kg] - % - Fsi [3x3] - Fixed Platform Inertia matrix [kg*m^2] - % - Mph [1x1] - Mobile Platform Height [m] - % - Mpr [1x1] - Mobile Platform Radius [m] + % - dLi[6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A} #+end_src -*** Optional Parameters +** Optional Parameters #+begin_src matlab arguments stewart - args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1 - args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3 - args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 125e-3 - args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 1 - args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3 - args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 + args.AP (3,1) double {mustBeNumeric} = zeros(3,1) + args.ARB (3,3) double {mustBeNumeric} = eye(3) end #+end_src -*** Create the =platforms= struct +** Use the Inverse Kinematic function #+begin_src matlab - platforms = struct(); + [Li, dLi] = inverseKinematics(stewart, 'AP', args.AP, 'ARB', args.ARB); - platforms.Fpm = args.Fpm; - platforms.Fph = args.Fph; - platforms.Fpr = args.Fpr; - platforms.Fpi = diag([1/12 * platforms.Fpm * (3*platforms.Fpr^2 + platforms.Fph^2), ... - 1/12 * platforms.Fpm * (3*platforms.Fpr^2 + platforms.Fph^2), ... - 1/2 * platforms.Fpm * platforms.Fpr^2]); - - platforms.Mpm = args.Mpm; - platforms.Mph = args.Mph; - platforms.Mpr = args.Mpr; - platforms.Mpi = diag([1/12 * platforms.Mpm * (3*platforms.Mpr^2 + platforms.Mph^2), ... - 1/12 * platforms.Mpm * (3*platforms.Mpr^2 + platforms.Mph^2), ... - 1/2 * platforms.Mpm * platforms.Mpr^2]); -#+end_src - -*** Save the =platforms= struct -#+begin_src matlab - stewart.platforms = platforms; + stewart.dLi = dLi; #+end_src * Utility Functions diff --git a/simscape_subsystems/stewart_strut.slx b/simscape_subsystems/stewart_strut.slx index 8c3e84ad3327dd9430d595d483176dc9dae37b36..94091dd7c7396543b9c336377d280abf9c5faccf 100644 GIT binary patch delta 16657 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 diff --git a/simulink/stewart_platform_dynamics.slx b/simulink/stewart_platform_dynamics.slx index c2cdc8894406d1da443d7350271885b9d819d79b..9a810617ee64919d1f0b8e588eef1e03813501cc 100644 GIT binary patch delta 9455 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 delta 9310 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 O2CU$~0BdaVX8S)k8A;>- diff --git a/src/initializeStewartPose.m b/src/initializeStewartPose.m new file mode 100644 index 0000000..a32f8eb --- /dev/null +++ b/src/initializeStewartPose.m @@ -0,0 +1,27 @@ +function [stewart] = initializeStewartPose(stewart, args) +% initializeStewartPose - Determine the initial stroke in each leg to have the wanted pose +% It uses the inverse kinematic +% +% Syntax: [stewart] = initializeStewartPose(stewart, args) +% +% Inputs: +% - stewart - A structure with the following fields +% - Aa [3x6] - The positions ai expressed in {A} +% - Bb [3x6] - The positions bi expressed in {B} +% - args - Can have the following fields: +% - AP [3x1] - The wanted position of {B} with respect to {A} +% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A} +% +% Outputs: +% - stewart - updated Stewart structure with the added fields: +% - dLi[6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A} + +arguments + stewart + args.AP (3,1) double {mustBeNumeric} = zeros(3,1) + args.ARB (3,3) double {mustBeNumeric} = eye(3) +end + +[Li, dLi] = inverseKinematics(stewart, 'AP', args.AP, 'ARB', args.ARB); + +stewart.dLi = dLi; diff --git a/stiffness-study.html b/stiffness-study.html deleted file mode 100644 index 254d5fb..0000000 --- a/stiffness-study.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - -Stiffness of the Stewart Platform - - - - - - - - - - - - -
- UP - | - HOME -
-

Stiffness of the Stewart Platform

-
-

Table of Contents

- -
- -
-

1 Functions

-
-
-
-

1.1 getStiffnessMatrix

-
-
-
function [K] = getStiffnessMatrix(k, J)
-% k - leg stiffness
-% J - Jacobian matrix
-    K = k*(J'*J);
-end
-
-
-
-
-
-
-
-

Author: Thomas Dehaeze

-

Created: 2019-08-26 lun. 11:56

-

Validate

-
- - diff --git a/stiffness-study.org b/stiffness-study.org deleted file mode 100644 index 4c734f1..0000000 --- a/stiffness-study.org +++ /dev/null @@ -1,41 +0,0 @@ -#+TITLE: Stiffness of the Stewart Platform -:DRAWER: -#+HTML_LINK_HOME: ./index.html -#+HTML_LINK_UP: ./index.html - -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: - -#+PROPERTY: header-args:matlab :session *MATLAB* -#+PROPERTY: header-args:matlab+ :tangle matlab/stiffness_study.m -#+PROPERTY: header-args:matlab+ :comments org -#+PROPERTY: header-args:matlab+ :exports both -#+PROPERTY: header-args:matlab+ :results none -#+PROPERTY: header-args:matlab+ :eval no-export -#+PROPERTY: header-args:matlab+ :noweb yes -#+PROPERTY: header-args:matlab+ :mkdirp yes -#+PROPERTY: header-args:matlab+ :output-dir figs -:END: - -* Functions - :PROPERTIES: - :HEADER-ARGS:matlab+: :exports code - :HEADER-ARGS:matlab+: :comments no - :HEADER-ARGS:matlab+: :mkdir yes - :HEADER-ARGS:matlab+: :eval no - :END: -** getStiffnessMatrix - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/getStiffnessMatrix.m - :END: -#+begin_src matlab - function [K] = getStiffnessMatrix(k, J) - % k - leg stiffness - % J - Jacobian matrix - K = k*(J'*J); - end -#+end_src