Tcl Library Source Code

Attachment Details
Login
Overview

Artifact ID: dff8452674e3dc9c50251de476886b55685074b8f55e6895f88d091d0ec2e703
Ticket: 5af6381a8be0d5a87505d7e28203fe69fa2b3019
Date: 2021-07-03 19:47:05
User: anonymous
Artifact Attached: ae66d4eee66c2d91bddc2500cb77b1459ef88e6597d7b46716f018898b86ed56
Filename:submission.txt
Description:Subject. Quadratic Equation Solution, 2 reals from Muller's method 5af6381a8be0d5a87505d7e28203fe69fa2b3019 Title: Quadratic Equation Solution, 2 reals from Muller's method Request real solutions from 2nd order quadratic equation in TCLLIB. Proc should return the real solution 1 or real solutions 1&2 from 3 quadratic coefficients.
Content:
     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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
   100
   101
   102
   103
   104
   105
   106
   107
   108
   109
   110
   111
   112
   113
   114
   115
   116
   117
   118
   119
   120
   121
   122
   123
   124
   125
   126
   127
   128
   129
   130
   131
   132
   133
   134
   135
   136
   137
   138
   139
   140
   141
   142
   143
   144
   145
   146
   147
   148
   149
   150
   151
   152
   153
   154
   155
   156
   157
Subject. Quadratic Equation Solution, 2 reals from Muller's method
5af6381a8be0d5a87505d7e28203fe69fa2b3019
Title:	Quadratic Equation Solution, 2 reals from Muller's method
 Request real solutions from 2nd order quadratic equation in TCLLIB. Proc should return  the real solution 1 or real solutions 1&2 from quadratic coefficients. Looking for real roots only here, discriminant => 0. Boiled down from evaluating discriminant, there are three possible real outcomes from 2nd order quadratic equation as follows: 1) discriminant $discriminant_2 > 0 has two real roots. 2) discriminant $discriminant_2 == 0 has one real root. 3) discriminant $discriminant_2 < 0 has two complex non-real roots. There are some 2nd order solutions that have no real solutions. Note that Muller's method or rearranged 2C formula avoids significant figure problem (somewhat). TCL may use math ops to eval rational fractions as inputs to subroutine for more significant figures. First argument is 3 execution options. option == 1 , return positive solution, option == 2 , return negative and positive solutions , option == 3 , return negative and positive solutions with diagnostics. 

Possible sources of error in numerical analysis. References reported potential error in significant figures from subtracting nearly equal quantities in formula. Also, when the two real roots are very close, cancellation may occur between the terms b2 and 4ac of the discriminant. Possibly diagnostics in subroutine should flag when these conditions are approached? With entry in agruments $args, it appears that multiple successive 2nd order quadratic equations could be solved with a few code switches.

If we put code for the real solutions for the 2nd order quadratic equations in the TCLLIB library. Maybe somebody will donate the code for the possible complex solutions, cubic solutions, quartic solutions, and diagnostics.  Thank you.

References.
********
https://wiki.tcl-lang.org/page/Ask%2C+and+it+shall+be+given+%23+13
Quadratic equations using TCLLIB
*******
But I am looking at the files in TCLLIB math and don't recognize the quadratic solution proc section. Thank you.
****** 
(AM) There is none, if you mean to solve a second-degree equation. The references to "quadratic" in the math module are all for very different entities.
*****
 7/2/2012. I'll write a small proc to solve reals in quadratic equations and put a ticket in the TCLLIB que. There was an interesting note on the quadratic equation in Wikipaedia. Thank you.
https://wiki.tcl-lang.org/page/Math+proc+templates+for+Prime+Number+generation+and+TCL+demo+example%2C+numerical+analysis?V=167
http://www.tcl-lang.org/community/tcl2015/assets/talk9/xra-slides.pdf
https://rosettacode.org/wiki/Roots_of_a_quadratic_function
https://wiki.tcl-lang.org/page/Seaching+for+Babylonian+Triplets+Slot+Calculator+Example
https://en.wikipedia.org/wiki/Quadratic_equation
https://en.wikipedia.org/wiki/Quadratic_function
https://en.wikipedia.org/wiki/Polynomial
https://en.wikipedia.org/wiki/Cubic_equation
https://en.wikipedia.org/wiki/Quartic_equation
Since the 16th century, similar formulas (using cube roots in addition to square roots), but much more complicated are known for equations of degree three and four (see cubic equation and quartic equation)
----
*** Subroutine Template 6,  Quadratic Equation Solution, Muller's method***
----
======
        # pretty print from autoindent and ased editor
        # quadratic_solution for math::stats? package
        # working under TCL version 8.6
        # console program written on Windows 10 on TCL
        # gold on TCL Club, 2Mar2021
        # note rearranged 2C formula avoids significant figure problem
        package require Tk
        console show
        package require math::numtheory
        namespace path {::tcl::mathop ::tcl::mathfunc math::numtheory }
        set tcl_precision 17
        # adapted from tcl-wiki Stats 2011-05-22, arithmetic mean  [RLE]
        #
        # ::math::quadratic_solution  
        #
        # Return the possible real solutions of quadratic equation from 3 coefficients
        #
        # Arguments:
        #    val  first value is option
        #    args other values are 3 coefficients of quadratic equation
        #
        # Results: 2 solutions, positive and negative
        #    looking for real roots only here, discriminant => 0  
        # option == 1 , return positive solution   
        # option == 2 , return negative and positive solutions 
        # option == 3 , return negative and positive solutions with diagnostics
        # there are some quadratic equations that have no real solutions.
        proc ::math::quadratic_solution {option args} {
            set N [ expr { [ llength $args ] + 1 } ]
            if { $N == 1  } { return 0 }
            set option_1 $option
            set answer [list ]
            set a [lindex  $args 0 ]
            set b [lindex  $args 1 ]
            set c [lindex  $args 2 ]         
            set denom_term_1 [ expr { $b*$b-4.*$a*$c } ] 
            set discriminant_2 [ expr { sqrt ($denom_term_1) } ]  
            ;# looking for real roots only here, discriminant => 0 
            if { $discriminant_2 < 0  } { return 0 }
            set solution_negative [ expr { ( 2.*$c)/( $discriminant_2 - $b) } ]
            set solution_positive [ expr { ( 2.*$c)/( -1.*$discriminant_2 - $b) } ]
            if { $option_1 == 1  } { lappend answer $solution_positive }
            if { $option_1 == 2  } { lappend answer  $solution_negative $solution_positive } 
            if { $option_1 == 3  } {
            lappend answer  $solution_negative $solution_positive
            puts " printout  diagnostics "
            puts " option number $option_1 ???  =? 3 returns  diagnostics "
            puts " a [lindex   $args 0  ] "
            puts " b  [lindex   $args 1  ] "
            puts " c [lindex   $args 2  ]  " 
            puts " discriminant_2 $discriminant_2 "
            if { $discriminant_2 > 0  } {
            puts "discriminant $discriminant_2 > 0 has two real roots "}
            if { $discriminant_2 == 0  } {
            puts "discriminant $discriminant_2 > 0 has one real root "}
            if { $discriminant_2 < 0  } {
            puts "discriminant $discriminant_2 < 0 has two complex non-real roots  "}                          }  
            return $answer          
        }
        # end of working deck
        # add cosmetics below to bottom of file 
        console show
        console eval {.console config -bg palegreen}
        console eval {.console config -font {fixed 20 bold}}
        console eval {wm geometry . 40x20}
        console eval {wm title . "  Console wrapper for quadratic_solution  proc"}
        console eval {. configure -background orange -highlightcolor brown -relief raised -border 30}
        puts "  Console wrapper for quadratic_solution proc"
        puts " Return the quadratic_solution 1 or 1&2  from   quadratic coefficients"
        puts " for  ::math::quadratic_solution  1 1 1.5 -1. returns  [ ::math::quadratic_solution  1 1 1.5 -1. ] "  
        puts " for  ::math::quadratic_solution 2 1 1.5 -1.  returns  [ ::math::quadratic_solution 2 1 1.5 -1.] "
        puts " for  ::math::quadratic_solution  1 1 2.66666 -1 returns [ ::math::quadratic_solution 1 1 2.66666 -1  ] "
        puts " for  ::math::quadratic_solution  2 1 2.66666 -1 returns [ ::math::quadratic_solution 2 1 2.66666 -1  ] "
        puts " for  ::math::quadratic_solution  1 200. -1.5e-12 -1 returns [ ::math::quadratic_solution 1 1 200. -1.5e-12  ] "
        puts " for  ::math::quadratic_solution  2 200. -1.5e-12 -1 returns [ ::math::quadratic_solution 2 1 200. -1.5e-12  ] "
        puts " for  ::math::quadratic_solution 1  returns zero returns [ ::math::quadratic_solution 1 ]  " 
        puts " option 3 prints out quadratic diagnostics  " 
        puts " for  ::math::quadratic_solution  3 200. -1.5e-12 -1 & diagnostics returns [ ::math::quadratic_solution 3 1 200. -1.5e-12  ] "
        puts "  TCL may use math ops to eval rational fractions as inputs to subroutine for more significant figures. "
        puts " for  ::math::quadratic_solution  3 1 <3./2.> -1. returns  [ ::math::quadratic_solution  3 1 [/ 3. 2.] -1. ] "
        puts " for  ::math::quadratic_solution  3 1 <8./3.> -1 returns [ ::math::quadratic_solution 3 1 [/ 8. 3.] -1  ] "
        #end of deck
======
----
*** Printout for Subroutine Template 6,  Quadratic Equation Solution, Muller's method***
======
Console wrapper for quadratic_solution proc
 Return the quadratic_solution 1 or 1&2  from   quadratic coefficients
 for  ::math::quadratic_solution  1 1 1.5 -1. returns  0.5 
 for  ::math::quadratic_solution 2 1 1.5 -1.  returns  -2.0 0.5 
 for  ::math::quadratic_solution  1 1 2.66666 -1 returns 0.3333340000012 
 for  ::math::quadratic_solution  2 1 2.66666 -1 returns -2.9999940000012004 0.3333340000012 
 for  ::math::quadratic_solution  1 200. -1.5e-12 -1 returns 7.4999999999999996e-15 
 for  ::math::quadratic_solution  2 200. -1.5e-12 -1 returns -105.553116266496 7.4999999999999996e-15 
 for  ::math::quadratic_solution 1  returns zero returns 0  
 option 3 prints out quadratic diagnostics  
 printout  diagnostics 
 option number 3 ???  =? 3 returns  diagnostics 
 a 1 
 b  200. 
 c -1.5e-12  
 discriminant_2 200.00000000000003 
discriminant 200.00000000000003 > 0 has two real roots 
 for  ::math::quadratic_solution  3 200. -1.5e-12 -1 & diagnostics returns -105.553116266496 7.4999999999999996e-15 
  TCL may use math ops to eval rational fractions as inputs to subroutine for more significant figures. 
 printout  diagnostics 
 option number 3 ???  =? 3 returns  diagnostics 
 a 1 
 b  1.5 
 c -1.  
 discriminant_2 2.5 
discriminant 2.5 > 0 has two real roots 
 for  ::math::quadratic_solution  3 1 <3./2.> -1. returns  -2.0 0.5 
 printout  diagnostics 
 option number 3 ???  =? 3 returns  diagnostics 
 a 1 
 b  2.6666666666666665 
 c -1  
 discriminant_2 3.3333333333333335 
 discriminant 3.3333333333333335 > 0 has two real roots 
 for  ::math::quadratic_solution  3 1 <8./3.> -1 returns -2.9999999999999987 0.33333333333333331 
(System32) 1 % 
======
----