How to resolve the algorithm Deming's funnel step by step in the Ada programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Deming's funnel step by step in the Ada programming language

Table of Contents

Problem Statement

W Edwards Deming was an American statistician and management guru who used physical demonstrations to illuminate his teachings. In one demonstration Deming repeatedly dropped marbles through a funnel at a target, marking where they landed, and observing the resulting pattern. He applied a sequence of "rules" to try to improve performance. In each case the experiment begins with the funnel positioned directly over the target. Apply the four rules to the set of 50 pseudorandom displacements provided (e.g in the Racket solution) for the dxs and dys. Output: calculate the mean and standard-deviations of the resulting x and y values for each rule.
Note that rules 2, 3, and 4 give successively worse results. Trying to deterministically compensate for a random process is counter-productive, but -- according to Deming -- quite a popular pastime: see the Further Information, below for examples. Stretch goal 1: Generate fresh pseudorandom data. The radial displacement of the drop from the funnel position is given by a Gaussian distribution (standard deviation is 1.0) and the angle of displacement is uniformly distributed. Stretch goal 2: Show scatter plots of all four results.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Deming's funnel step by step in the Ada programming language

Source code in the ada programming language

with Ada.Numerics.Elementary_Functions;
with Ada.Text_IO;

procedure Demings_Funnel is

   type Float_List is array (Positive range <>) of Float;

   Dxs : constant Float_List :=
     (-0.533,  0.270,  0.859, -0.043, -0.205, -0.127, -0.071,  0.275,
       1.251, -0.231, -0.401,  0.269,  0.491,  0.951,  1.150,  0.001,
      -0.382,  0.161,  0.915,  2.080, -2.337,  0.034, -0.126,  0.014,
       0.709,  0.129, -1.093, -0.483, -1.193,  0.020, -0.051,  0.047,
      -0.095,  0.695,  0.340, -0.182,  0.287,  0.213, -0.423, -0.021,
      -0.134,  1.798,  0.021, -1.099, -0.361,  1.636, -1.134,  1.315,
       0.201,  0.034,  0.097, -0.170,  0.054, -0.553, -0.024, -0.181,
      -0.700, -0.361, -0.789,  0.279, -0.174, -0.009, -0.323, -0.658,
       0.348, -0.528,  0.881,  0.021, -0.853,  0.157,  0.648,  1.774,
      -1.043,  0.051,  0.021,  0.247, -0.310,  0.171,  0.000,  0.106,
       0.024, -0.386,  0.962,  0.765, -0.125, -0.289,  0.521,  0.017,
       0.281, -0.749, -0.149, -2.436, -0.909,  0.394, -0.113, -0.598,
       0.443, -0.521, -0.799,  0.087);

   Dys : constant Float_List :=
     ( 0.136,  0.717,  0.459, -0.225,  1.392,  0.385,  0.121, -0.395,
       0.490, -0.682, -0.065,  0.242, -0.288,  0.658,  0.459,  0.000,
       0.426,  0.205, -0.765, -2.188, -0.742, -0.010,  0.089,  0.208,
       0.585,  0.633, -0.444, -0.351, -1.087,  0.199,  0.701,  0.096,
      -0.025, -0.868,  1.051,  0.157,  0.216,  0.162,  0.249, -0.007,
       0.009,  0.508, -0.790,  0.723,  0.881, -0.508,  0.393, -0.226,
       0.710,  0.038, -0.217,  0.831,  0.480,  0.407,  0.447, -0.295,
       1.126,  0.380,  0.549, -0.445, -0.046,  0.428, -0.074,  0.217,
      -0.822,  0.491,  1.347, -0.141,  1.230, -0.044,  0.079,  0.219,
       0.698,  0.275,  0.056,  0.031,  0.421,  0.064,  0.721,  0.104,
      -0.729,  0.650, -1.103,  0.154, -1.720,  0.051, -0.385,  0.477,
       1.537, -0.901,  0.939, -0.411,  0.341, -0.411,  0.106,  0.224,
      -0.947, -1.424, -0.542, -1.032);

   type Rule_Access is access function (Z, Dz : Float) return Float;

   function Funnel (List : in Float_List;
                    Rule : in Rule_Access)
                   return Float_List
   is
      Correc : Float := 0.0;
      Result : Float_List (List'Range);
   begin
      for I in List'Range loop
         Result (I) := Correc + List (I);
         Correc     := Rule (Correc, List (I));
      end loop;
      return Result;
   end Funnel;

   function Mean (List : in Float_List)
                 return Float
   is
      Sum : Float := 0.0;
   begin
      for Value of List loop
         Sum := Sum + Value;
      end loop;
      return Sum / Float (List'Length);
   end Mean;

   function Stddev (List : in Float_List)
                   return Float
   is
      use Ada.Numerics.Elementary_Functions;
      M   : constant Float := Mean (List);
      Sum : Float          := 0.0;
   begin
      for F of List loop
         Sum := Sum + (F - M) * (F - M);
      end loop;
      return Sqrt (Sum / Float (List'Length));
   end Stddev;

   procedure Experiment (Label : in String;
                         Rule  : in Rule_Access)
   is
      package Float_IO is new Ada.Text_IO.Float_IO (Float);
      use Ada.Text_IO;
      use Float_IO;
      Rxs : constant Float_List := Funnel (Dxs, Rule);
      Rys : constant Float_List := Funnel (Dys, Rule);
   begin
      Default_Exp  := 0;
      Default_Fore := 4;
      Default_Aft  := 4;
      Put_Line (Label & " :   x        y");
      Put ("Mean:   "); Put (Mean (Rxs));   Put (Mean (Rys));   New_Line;
      Put ("StdDev: "); Put (Stddev (Rxs)); Put (Stddev (Rys)); New_Line;
      New_Line;
   end Experiment;

   function Rule_1 (Z, Dz : Float) return Float is (0.0);
   function Rule_2 (Z, Dz : Float) return Float is (-Dz);
   function Rule_3 (Z, Dz : Float) return Float is (-Z - Dz);
   function Rule_4 (Z, Dz : Float) return Float is (Z + Dz);
begin
   Experiment ("Rule 1", Rule_1'Access);
   Experiment ("Rule 2", Rule_2'Access);
   Experiment ("Rule 3", Rule_3'Access);
   Experiment ("Rule 4", Rule_4'Access);
end Demings_Funnel;


  

You may also check:How to resolve the algorithm Map range step by step in the SparForte programming language
You may also check:How to resolve the algorithm Cumulative standard deviation step by step in the jq programming language
You may also check:How to resolve the algorithm Spinning rod animation/Text step by step in the M2000 Interpreter programming language
You may also check:How to resolve the algorithm Check output device is a terminal step by step in the REXX programming language
You may also check:How to resolve the algorithm Pascal's triangle step by step in the Erlang programming language