Title: | Finds Roots, Extrema and Inflection Points of a Curve |
---|---|
Description: | Implementation of Taylor Regression Estimator (TRE), Tulip Extreme Finding Estimator (TEFE), Bell Extreme Finding Estimator (BEFE), Integration Extreme Finding Estimator (IEFE) and Integration Root Finding Estimator (IRFE) for roots, extrema and inflections of a curve . Christopoulos, DT (2019) <doi:10.13140/RG.2.2.17158.32324> . Christopoulos, DT (2016) <doi:10.2139/ssrn.3043076> . Christopoulos, DT (2016) <https://veltech.edu.in/wp-content/uploads/2016/04/Paper-04-2016.pdf> . Christopoulos, DT (2014) <arXiv:1206.5478v2 [math.NA]> . |
Authors: | Demetris T. Christopoulos |
Maintainer: | Demetris T. Christopoulos <[email protected]> |
License: | GPL-2 |
Version: | 1.2.1 |
Built: | 2025-02-15 05:09:53 UTC |
Source: | https://github.com/dchristop/rootsextremainflections |
This package contains functions for computing roots, extrema and inflection points of a curve that is the graph of a smooth function when we have only a data set , generated from it by the procedure
or for the noisy case by
with a zero mean error,
, by using the Taylor Regression Estimator (TRE) method, which is described briefly here.
When we want to find a root for a function
by using the traditional Numerical Analysis methods (bisection, secant, Newton-Raphson etc), it is necessary to know the exact formula of
. Unfortunately in research problems we do not know that formula and our data are also of a noisy type.
In this package we use the Taylor Regression Estimator (TRE) method, which can work when we know the discrete values
of our known or unknown smooth function
. Additionally the method works with satisfactory accuracy also for the corresponding noisy values
.
The computation of extrema and inflection points for a smooth
is merely a problem of root finding for first and second derivative respectively, thus TRE method can also find an extreme or an inflection point.
In a few words, the method is referencing to the well known Taylor polynomial of a smooth function
around a point
,
When the coefficients , as computed using a polynomial regression, have minimum absolute value, then the corresponding points
are the estimations of the root, extreme or inflection point, respectively. Essentially Taylor Regression (TR) is polynomial regression for Taylor polynomial.
For a more rigorous definition of the terms TR, TRE method, further discussion and numerical examples, see Christopoulos (2014).
From version 1.2.1 a set of new methods has been added:
Tulip Extreme Finding Estimator (TEFE)
Bell Extreme Finding Estimator (BEFE)
Integration Extreme Finding Estimator (IEFE)
Integration Root Finding Estimator (IRFE)
All these methods are defined and explained at Christopoulos (2019).
After adding functions for finding roots and extrema without regression, current package constitutes the core of new filed , called 'Noisy Numerical Analysis', which combines Geometry, Calculus, Numerical Analysis and Statistics and treat noisy curves for solving known problems of Numerical Analysis.
Demetris T. Christopoulos
Maintainer: Demetris T. Christopoulos <[email protected]>
Demetris T. Christopoulos (2014). Roots, extrema and inflection points by using a proper Taylor regression procedure. SSRN. https://dx.doi.org/10.2139/ssrn.2521403
Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
#Load data: data(xydat) # #Extract x and y variables: x=xydat$x;y=xydat$y # #Find root, plot results, print Taylor coefficients and rho estimation: b<-rootxi(x,y,1,length(x),5,5,plots=TRUE);b$an;b$froot; # #Find extreme, plot results, print Taylor coefficients and rho estimation: c<-extremexi(x,y,1,length(x),5,5,plots=TRUE);c$an;c$fextr; # #Find inflection point, plot results, print Taylor coefficients and rho estimation: d<-inflexi(x,y,1,length(x),5,5,plots=TRUE);d$an;d$finfl; # Create a relative big data set... f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(5001,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5); # #Find root, plot results, print Taylor coefficients and rho estimation in parallel: #b1<-rootxi(x,y,1,round(length(x)/2),5,5,plots=TRUE,doparallel = TRUE);b1$an;b1$froot; # Available workers are 12 # Time difference of 5.838743 secs # 2.5 % 97.5 % an # a0 -0.006960052 0.004414505 -0.001272774 # a1 -2.982715739 -2.933308292 -2.958012016 # a2 -0.308844145 -0.213011162 -0.260927654 # a3 0.806555336 0.874000586 0.840277961 # a4 -0.180720951 -0.161344935 -0.171032943 # a5 0.007140500 0.009083859 0.008112180 # [1] 177.0000000 0.2924279 # Compare with exact root = 0.2876110196 #Find extreme, plot results, print Taylor coefficients and rho estimation in parallel: #c1<-extremexi(x,y,1,round(length(x)/2),5,5,plots=TRUE,doparallel = TRUE);c1$an;c1$fextr; # Available workers are 12 # Time difference of 5.822514 secs # 2.5 % 97.5 % an # a0 -3.0032740050 -2.994123850 -2.998698927 # a1 -0.0006883998 0.012218393 0.005764997 # a2 1.4745326519 1.489836668 1.482184660 # a3 -0.0340626683 -0.025094859 -0.029578763 # a4 -0.1100798736 -0.105430525 -0.107755199 # a5 0.0071405003 0.009083859 0.008112180 # [1] 1022.000000 1.852496 # Compare with exact extreme = 1.858407346 #Find inflection point, plot results, print Taylor coefficients and rho estimation in parallel: #d1<-inflexi(x,y,1090,2785,5,5,plots=TRUE,doparallel = TRUE);d1$an;d1$finfl; # Available workers are 12 # Time difference of 4.343851 secs # 2.5 % 97.5 % an # a0 -0.008238016 0.002091071 -0.0030734725 # a1 2.995813560 3.023198534 3.0095060468 # a2 -0.014591465 0.015326175 0.0003673549 # a3 -0.531029710 -0.484131902 -0.5075808056 # a4 -0.008253975 0.007556465 -0.0003487551 # a5 0.016126428 0.034688019 0.0254072236 # [1] 800.000000 3.427705 # Compare with exact inflection = 3.429203673 # Or execute rootexinf() and find a set of them at once and in same time: #a<-rootexinf(x,y,100,round(length(x)/2),5,plots = TRUE,doparallel = TRUE); #a$an0;a$an1;a$an2;a$frexinf; # Available workers are 12 # Time difference of 5.565372 secs # 2.5 % 97.5 % an0 # a0 -0.008244278 0.00836885 6.228596e-05 # a1 -2.927764078 -2.84035634 -2.884060e+00 # a2 -0.447136449 -0.30473094 -3.759337e-01 # a3 0.857290490 0.94794071 9.026156e-01 # a4 -0.198104383 -0.17360676 -1.858556e-01 # a5 0.008239609 0.01059792 9.418764e-03 # 2.5 % 97.5 % an1 # a0 -3.005668018 -2.99623116 -3.000949590 # a1 -0.003173501 0.00991921 0.003372854 # a2 1.482600580 1.50077450 1.491687542 # a3 -0.034503271 -0.02551597 -0.030009618 # a4 -0.115396537 -0.10894117 -0.112168855 # a5 0.008239609 0.01059792 0.009418764 # 2.5 % 97.5 % an2 # a0 0.083429390 0.092578772 0.088004081 # a1 3.007115452 3.027343849 3.017229650 # a2 -0.009867779 0.006590042 -0.001638868 # a3 -0.517993955 -0.497886933 -0.507940444 # a4 -0.043096158 -0.029788902 -0.036442530 # a5 0.008239609 0.010597918 0.009418764 # index value # root 74 0.2878164 # extreme 923 1.8524956 # inflection 1803 3.4604842 #Here a first plot always is helpful.
#Load data: data(xydat) # #Extract x and y variables: x=xydat$x;y=xydat$y # #Find root, plot results, print Taylor coefficients and rho estimation: b<-rootxi(x,y,1,length(x),5,5,plots=TRUE);b$an;b$froot; # #Find extreme, plot results, print Taylor coefficients and rho estimation: c<-extremexi(x,y,1,length(x),5,5,plots=TRUE);c$an;c$fextr; # #Find inflection point, plot results, print Taylor coefficients and rho estimation: d<-inflexi(x,y,1,length(x),5,5,plots=TRUE);d$an;d$finfl; # Create a relative big data set... f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(5001,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5); # #Find root, plot results, print Taylor coefficients and rho estimation in parallel: #b1<-rootxi(x,y,1,round(length(x)/2),5,5,plots=TRUE,doparallel = TRUE);b1$an;b1$froot; # Available workers are 12 # Time difference of 5.838743 secs # 2.5 % 97.5 % an # a0 -0.006960052 0.004414505 -0.001272774 # a1 -2.982715739 -2.933308292 -2.958012016 # a2 -0.308844145 -0.213011162 -0.260927654 # a3 0.806555336 0.874000586 0.840277961 # a4 -0.180720951 -0.161344935 -0.171032943 # a5 0.007140500 0.009083859 0.008112180 # [1] 177.0000000 0.2924279 # Compare with exact root = 0.2876110196 #Find extreme, plot results, print Taylor coefficients and rho estimation in parallel: #c1<-extremexi(x,y,1,round(length(x)/2),5,5,plots=TRUE,doparallel = TRUE);c1$an;c1$fextr; # Available workers are 12 # Time difference of 5.822514 secs # 2.5 % 97.5 % an # a0 -3.0032740050 -2.994123850 -2.998698927 # a1 -0.0006883998 0.012218393 0.005764997 # a2 1.4745326519 1.489836668 1.482184660 # a3 -0.0340626683 -0.025094859 -0.029578763 # a4 -0.1100798736 -0.105430525 -0.107755199 # a5 0.0071405003 0.009083859 0.008112180 # [1] 1022.000000 1.852496 # Compare with exact extreme = 1.858407346 #Find inflection point, plot results, print Taylor coefficients and rho estimation in parallel: #d1<-inflexi(x,y,1090,2785,5,5,plots=TRUE,doparallel = TRUE);d1$an;d1$finfl; # Available workers are 12 # Time difference of 4.343851 secs # 2.5 % 97.5 % an # a0 -0.008238016 0.002091071 -0.0030734725 # a1 2.995813560 3.023198534 3.0095060468 # a2 -0.014591465 0.015326175 0.0003673549 # a3 -0.531029710 -0.484131902 -0.5075808056 # a4 -0.008253975 0.007556465 -0.0003487551 # a5 0.016126428 0.034688019 0.0254072236 # [1] 800.000000 3.427705 # Compare with exact inflection = 3.429203673 # Or execute rootexinf() and find a set of them at once and in same time: #a<-rootexinf(x,y,100,round(length(x)/2),5,plots = TRUE,doparallel = TRUE); #a$an0;a$an1;a$an2;a$frexinf; # Available workers are 12 # Time difference of 5.565372 secs # 2.5 % 97.5 % an0 # a0 -0.008244278 0.00836885 6.228596e-05 # a1 -2.927764078 -2.84035634 -2.884060e+00 # a2 -0.447136449 -0.30473094 -3.759337e-01 # a3 0.857290490 0.94794071 9.026156e-01 # a4 -0.198104383 -0.17360676 -1.858556e-01 # a5 0.008239609 0.01059792 9.418764e-03 # 2.5 % 97.5 % an1 # a0 -3.005668018 -2.99623116 -3.000949590 # a1 -0.003173501 0.00991921 0.003372854 # a2 1.482600580 1.50077450 1.491687542 # a3 -0.034503271 -0.02551597 -0.030009618 # a4 -0.115396537 -0.10894117 -0.112168855 # a5 0.008239609 0.01059792 0.009418764 # 2.5 % 97.5 % an2 # a0 0.083429390 0.092578772 0.088004081 # a1 3.007115452 3.027343849 3.017229650 # a2 -0.009867779 0.006590042 -0.001638868 # a3 -0.517993955 -0.497886933 -0.507940444 # a4 -0.043096158 -0.029788902 -0.036442530 # a5 0.008239609 0.010597918 0.009418764 # index value # root 74 0.2878164 # extreme 923 1.8524956 # inflection 1803 3.4604842 #Here a first plot always is helpful.
Given a planar curve we want to know its convexity ranges, the index for use in ESE or EDE methods, the existence of a maximum or minimum and the classification as tulip or bell.
classify_curve(x, y)
classify_curve(x, y)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
A first check for the existence of infiniteies is performed. If infinities exist, then all outputs are set to 'NA', otherwise main code works.
A list with next members:
ctype the convexity type of curve: convex, concave, convex/concave or concave/convex
index the relevant index for ESE or EDE usage: 0,1,0,1 respectively to 'ctype' previously presented values
asymmetry a classification of asymmetry type, if exists
totalconvexity the overall dominant convexity type of curve if we omit the fact probably has ranges of different types of convexity
ismax logical value, TRUE if a maximum seems to exits, FALSE if a minimum seems to be the case, 'NA' otherwise
shapetype the shape of extreme as tulip, bell or 'NA'
Results of current function have an approximation type, since not all kind of curves can be classified by a given procedure. Caution has been taken in order to be able to infer for the very basic attributes.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
[2]Demetris T. Christopoulos (2014). Developing methods for identifying the inflection point of a convex/concave curve. arXiv:1206.5478v2 [math.NA]. https://arxiv.org/pdf/1206.5478v2.pdf
[3]Demetris T. Christopoulos (2016). On the efficient identification of an inflection point.International Journal of Mathematics and Scientific Computing, (ISSN: 2231-5330), vol. 6(1). https://veltech.edu.in/wp-content/uploads/2016/04/Paper-04-2016.pdf
symextreme
, scan_curve
, scan_noisy_curve
## Lets create a convex/concave curve and classify it: f=function(x){5+5*tanh(x-5)} x=seq(0,8,0.01) y=f(x) plot(x,y,pch=19,cex=0.2) cc=classify_curve(x,y) cc$ctype ## [1] "convex_concave" cc$index ## [1] 0 ## Use 'index': ede(x,y,cc$index) ## j1 j2 chi ## EDE 369 633 5 ## Lets create an 'almost convex' curve and see it: f=function(x){-x^3+5*x-6} x=seq(-2.5,1.5,0.01) y=f(x) plot(x,y,pch=19,cex=0.2) cc=classify_curve(x,y) cc$totalconvexity ## [1] "convex" ## Check for existence of a maximum for a noisy curve: f=function(x){100-(x-5)^2} x=seq(0,12,by=0.01); r=1.5;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.2) cc=classify_curve(x,y) cc$ismax ## [1] TRUE
## Lets create a convex/concave curve and classify it: f=function(x){5+5*tanh(x-5)} x=seq(0,8,0.01) y=f(x) plot(x,y,pch=19,cex=0.2) cc=classify_curve(x,y) cc$ctype ## [1] "convex_concave" cc$index ## [1] 0 ## Use 'index': ede(x,y,cc$index) ## j1 j2 chi ## EDE 369 633 5 ## Lets create an 'almost convex' curve and see it: f=function(x){-x^3+5*x-6} x=seq(-2.5,1.5,0.01) y=f(x) plot(x,y,pch=19,cex=0.2) cc=classify_curve(x,y) cc$totalconvexity ## [1] "convex" ## Check for existence of a maximum for a noisy curve: f=function(x){100-(x-5)^2} x=seq(0,12,by=0.01); r=1.5;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.2) cc=classify_curve(x,y) cc$ismax ## [1] TRUE
It takes as input the x, y numeric vectors, the indices for the range to be searched plus some other
options and finds the extreme point for that interval, while it plots data, Taylor polynomial and the computed coefficients.
extremexi(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
extremexi(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
x |
A numeric vector for the independent variable |
y |
A numeric vector for the dependent variable |
i1 |
The first index for choosing a specific interval |
i2 |
The second index for choosing a specific interval |
nt |
The degree of the Taylor polynomial that will be fitted to the data |
alpha |
The level of statistical significance for the confidence intervals of coefficients |
xlb |
A label for the x-variable (default value = "x") |
ylb |
A label for the y-variable (default value = "y") |
xnd |
The number of digits for plotting the x-axis (default value = 3) |
ynd |
The number of digits for plotting the y-axis (default value = 3) |
plots |
If plots=TRUE then a plot is created on default monitor (default value = TRUE) |
plotpdf |
If plotpdf=TRUE then a pdf plot is created and stored on working directory (default value = FALSE) |
doparallel |
If doparallel=TRUE then parallel computing is applied, based on the available workers of current machine (default value = FALSE) |
The point which makes the relevant
minimum is the estimation for the function's extreme point at the interval
.
It returns an environment with two components:
an |
a matrix with 3 columns: lower, upper bound of confidence interval and middle value for each coefficient an |
fextr |
a list with 2 members: the position i and the value of the estimated extreme point |
When you are using RStudio it is necessary to leave enough space for the plot window in order for the plots to appear normally.
The data should come from a function at least in order to be able to find an extreme point, if exists.
Demetris T. Christopoulos
Demetris T. Christopoulos (2014). Roots, extrema and inflection points by using a proper Taylor regression procedure. SSRN. https://dx.doi.org/10.2139/ssrn.2521403
#Load data: # data(xydat) # #Extract x and y variables: # x=xydat$x;y=xydat$y # #Find extreme point, plot results, print Taylor coefficients and rho estimation: # c<-extremexi(x,y,1,length(x),5,5,plots=TRUE);c$an;c$fextr; # #Find multiple extrema. #Let's create some data: # f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(101,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y) # #The first extreme point is c1<-extremexi(x,y,1,40,5,5,plots=TRUE);c1$an;c1$fextr; # 2.5 % 97.5 % an # a0 -3.02708631 -2.94592364 -2.986504975 # a1 0.07660314 0.24706531 0.161834227 # a2 1.42127770 1.58580632 1.503542012 # a3 -0.09037154 0.10377241 0.006700434 # a4 -0.14788899 -0.08719428 -0.117541632 # a5 -0.03822416 0.01425066 -0.011986748 # [1] 22.000000 1.917229 #Compare it with the actual rho_1=1.858407346 # #The second extreme point is c2<-extremexi(x,y,50,80,5,5,plots=TRUE);c2$an;c2$fextr; # 2.5 % 97.5 % an # a0 2.89779980 3.064703163 2.9812515 # a1 0.27288720 0.541496278 0.4071917 # a2 -1.81454401 -0.677932480 -1.2462382 # a3 -1.76290384 0.216201349 -0.7733512 # a4 0.02548354 1.269671304 0.6475774 # a5 -0.25156866 0.007565154 -0.1220018 # [1] 7.000000 4.896521 #You have to compare it with the actual value of rho_2=5.0 # #Finally the third extreme point is c3<-extremexi(x,y,80,length(x),5,5,plots=TRUE);c3$an;c3$fextr; # 2.5 % 97.5 % an # a0 -3.0637461 -2.9218614 -2.9928037 # a1 -0.2381605 0.2615635 0.0117015 # a2 0.7860259 2.0105383 1.3982821 # a3 -1.4187417 0.7472155 -0.3357631 # a4 -0.7943208 1.0876143 0.1466468 # a5 -0.6677733 1.7628833 0.5475550 # [1] 11.000000 8.137392 #You have to compare it with the actual value of rho_3=8.141592654
#Load data: # data(xydat) # #Extract x and y variables: # x=xydat$x;y=xydat$y # #Find extreme point, plot results, print Taylor coefficients and rho estimation: # c<-extremexi(x,y,1,length(x),5,5,plots=TRUE);c$an;c$fextr; # #Find multiple extrema. #Let's create some data: # f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(101,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y) # #The first extreme point is c1<-extremexi(x,y,1,40,5,5,plots=TRUE);c1$an;c1$fextr; # 2.5 % 97.5 % an # a0 -3.02708631 -2.94592364 -2.986504975 # a1 0.07660314 0.24706531 0.161834227 # a2 1.42127770 1.58580632 1.503542012 # a3 -0.09037154 0.10377241 0.006700434 # a4 -0.14788899 -0.08719428 -0.117541632 # a5 -0.03822416 0.01425066 -0.011986748 # [1] 22.000000 1.917229 #Compare it with the actual rho_1=1.858407346 # #The second extreme point is c2<-extremexi(x,y,50,80,5,5,plots=TRUE);c2$an;c2$fextr; # 2.5 % 97.5 % an # a0 2.89779980 3.064703163 2.9812515 # a1 0.27288720 0.541496278 0.4071917 # a2 -1.81454401 -0.677932480 -1.2462382 # a3 -1.76290384 0.216201349 -0.7733512 # a4 0.02548354 1.269671304 0.6475774 # a5 -0.25156866 0.007565154 -0.1220018 # [1] 7.000000 4.896521 #You have to compare it with the actual value of rho_2=5.0 # #Finally the third extreme point is c3<-extremexi(x,y,80,length(x),5,5,plots=TRUE);c3$an;c3$fextr; # 2.5 % 97.5 % an # a0 -3.0637461 -2.9218614 -2.9928037 # a1 -0.2381605 0.2615635 0.0117015 # a2 0.7860259 2.0105383 1.3982821 # a3 -1.4187417 0.7472155 -0.3357631 # a4 -0.7943208 1.0876143 0.1466468 # a5 -0.6677733 1.7628833 0.5475550 # [1] 11.000000 8.137392 #You have to compare it with the actual value of rho_3=8.141592654
Given a noisy or not planar curve as a set of discrete points we use Integration Extreme Finding Estimator (IEFE) algorithm as it is described at [1] in ordfer to find the extreme point of it.
findextreme(x, y, parallel = FALSE, silent = TRUE, tryfast = FALSE)
findextreme(x, y, parallel = FALSE, silent = TRUE, tryfast = FALSE)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
parallel |
Logical input, if TRUE then parallel processing will be used (default=FALSE) |
silent |
Logical input, if TRUE then no details will be printed out during code execution (default=TRUE) |
tryfast |
Logical input, if TRUE then instead 'BEDE' will be used from IEFE algorithm instead of BESE (default=FALSE) |
The parallel=TRUE otpion must be used if length(x)>20000. The tryfast=TRUE can be used for big data sets, but BEDE is not so accuracy as BESE, so use it with caution.
A named vector with next components is returned:
x1 the left endpoint of the final interval of BESE or BEDE iterations
x2 the right endpoint of the final interval of BESE or BEDE iterations
chi the estimation of extreme as x-abscissa
chi the estimation of extreme as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
The 'yvalue' at output vector is an interpolation approxiamtion for the y-value of unknown function at its extreme point 'chi' and does not mean that it will be certainly accurate. Thta is the truth if underlying function can be well approximated by low order polynomials.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
symextreme
, findmaxtulip
, findmaxbell
## Legendre polynomial 5th order ## True extreme point p=0.2852315165, y=0.3466277 f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(0,0.7,0.001);y=f(x) plot(x,y,pch=19,cex=0.5) a=findextreme(x,y) a ## x1 x2 chi yvalue ## 0.2840000 0.2860000 0.2850000 0.3466274 sol=a['chi'] abline(h=0) abline(v=sol) abline(v=a[1:2],lty=2) abline(h=f(sol),lty=2) points(sol,f(sol),pch=17,cex=2) # ## The same function with noise from U(-0.05,0.05) set.seed(2019-07-26);r=0.05;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) a=findextreme(x,y) a ## x1 x2 chi yvalue ## 0.2890000 0.2910000 0.2900000 0.3895484 sol=a['chi'] abline(h=0) abline(v=sol) abline(v=a[1:2],lty=2) abline(h=f(sol),lty=2) points(sol,f(sol),pch=17,cex=2) #
## Legendre polynomial 5th order ## True extreme point p=0.2852315165, y=0.3466277 f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(0,0.7,0.001);y=f(x) plot(x,y,pch=19,cex=0.5) a=findextreme(x,y) a ## x1 x2 chi yvalue ## 0.2840000 0.2860000 0.2850000 0.3466274 sol=a['chi'] abline(h=0) abline(v=sol) abline(v=a[1:2],lty=2) abline(h=f(sol),lty=2) points(sol,f(sol),pch=17,cex=2) # ## The same function with noise from U(-0.05,0.05) set.seed(2019-07-26);r=0.05;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) a=findextreme(x,y) a ## x1 x2 chi yvalue ## 0.2890000 0.2910000 0.2900000 0.3895484 sol=a['chi'] abline(h=0) abline(v=sol) abline(v=a[1:2],lty=2) abline(h=f(sol),lty=2) points(sol,f(sol),pch=17,cex=2) #
For a curve that can be classified as 'bell' a fast computation of its maximum is performed by applying Bell Extreme Finding Estimator (BEFE) algorithm of [1].
findmaxbell(x, y, concave = TRUE)
findmaxbell(x, y, concave = TRUE)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
concave |
Logical input, if TRUE then curve is supposed to have a maximum (default=TRUE) |
If we want to compute minimum we just set concave=FALSE and proceed.
A named vector with next components is returned:
j1 the index of x-left
j2 the index of x-right
chi the estimation of extreme as x-abscissa
Please use function classify_curve
if you have not visual inspection in order to find the extreme type. Do not use that function if curve shape is not 'bell', use either symextreme
or findextreme
.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
classify_curve
, symextreme
, findmaxtulip
, findextreme
# f=function(x){1/(1+x^2)} x=seq(-2,2.0,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "bell" a1<-findmaxbell(x,y) a1 ## j1 j2 chi ## 1.770000e+02 2.250000e+02 1.110223e-16 abline(v=a1['chi']) abline(v=x[a1[1:2]],lty=2);abline(h=y[a1[1:2]],lty=2) points(x[a1[1]:a1[2]],y[a1[1]:a1[2]],pch=19,cex=0.5,col='blue') # ## Same curve with noise from U(-0.05,0.05) set.seed(2019-07-26);r=0.05;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "bell" a1<-findmaxbell(x,y) a1 ## j1 j2 chi ## 169.00 229.00 -0.02 abline(v=a1['chi']) abline(v=x[a1[1:2]],lty=2);abline(h=y[a1[1:2]],lty=2) points(x[a1[1]:a1[2]],y[a1[1]:a1[2]],pch=19,cex=0.5,col='blue') #
# f=function(x){1/(1+x^2)} x=seq(-2,2.0,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "bell" a1<-findmaxbell(x,y) a1 ## j1 j2 chi ## 1.770000e+02 2.250000e+02 1.110223e-16 abline(v=a1['chi']) abline(v=x[a1[1:2]],lty=2);abline(h=y[a1[1:2]],lty=2) points(x[a1[1]:a1[2]],y[a1[1]:a1[2]],pch=19,cex=0.5,col='blue') # ## Same curve with noise from U(-0.05,0.05) set.seed(2019-07-26);r=0.05;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "bell" a1<-findmaxbell(x,y) a1 ## j1 j2 chi ## 169.00 229.00 -0.02 abline(v=a1['chi']) abline(v=x[a1[1:2]],lty=2);abline(h=y[a1[1:2]],lty=2) points(x[a1[1]:a1[2]],y[a1[1]:a1[2]],pch=19,cex=0.5,col='blue') #
For a curve that can be classified as 'tulip' a fast computation of its maximum is performed by applying Tulip Extreme Finding Estimator (TEFE) algorithm of [1].
findmaxtulip(x, y, concave = TRUE)
findmaxtulip(x, y, concave = TRUE)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
concave |
Logical input, if TRUE then curve is supposed to have a maximum (default=TRUE) |
If we want to compute minimum we just set concave=FALSE and proceed.
A named vector with next components is returned:
j1 the index of x vextor that is the left endpoint of final symmetrization interval
j1 the index of x vextor that is the right endpoint of final symmetrization interval
chi the estimation of extreme as x-abscissa
Please use function classify_curve
if you have not visual inspection in order to find the extreme type. Do not use that function if curve shape is not 'tulip', use either symextreme
or findextreme
.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
classify_curve
, symextreme
, findmaxbell
, findextreme
# f=function(x){100-(x-5)^2} x=seq(0,12,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "tulip" a<-findmaxtulip(x,y) a ## j1 j2 chi ## 1 1001 5 abline(v=a['chi']) abline(v=x[a[1:2]],lty=2);abline(h=y[a[1:2]],lty=2) points(x[a[1]:a[2]],y[a[1]:a[2]],pch=19,cex=0.5,col='blue') # ## Same curve with noise from U(-1.5,1.5) set.seed(2019-07-26);r=1.5;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "tulip" plot(x,y,pch=19,cex=0.5) a<-findmaxtulip(x,y) a ## j1 j2 chi ## 1.000 1002.000 5.005 abline(v=a['chi']) abline(v=x[a[1:2]],lty=2);abline(h=y[a[1:2]],lty=2) points(x[a[1]:a[2]],y[a[1]:a[2]],pch=19,cex=0.5,col='blue') #
# f=function(x){100-(x-5)^2} x=seq(0,12,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "tulip" a<-findmaxtulip(x,y) a ## j1 j2 chi ## 1 1001 5 abline(v=a['chi']) abline(v=x[a[1:2]],lty=2);abline(h=y[a[1:2]],lty=2) points(x[a[1]:a[2]],y[a[1]:a[2]],pch=19,cex=0.5,col='blue') # ## Same curve with noise from U(-1.5,1.5) set.seed(2019-07-26);r=1.5;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) cc=classify_curve(x,y) cc$shapetype ## 1] "tulip" plot(x,y,pch=19,cex=0.5) a<-findmaxtulip(x,y) a ## j1 j2 chi ## 1.000 1002.000 5.005 abline(v=a['chi']) abline(v=x[a[1:2]],lty=2);abline(h=y[a[1:2]],lty=2) points(x[a[1]:a[2]],y[a[1]:a[2]],pch=19,cex=0.5,col='blue') #
Given a noisy or not planar curve as a set of discrete points we use Integration Root Finding Estimator (IRFE) algorithm as it is described at [1] in ordfer to find the root of it.
findroot(x, y, parallel = FALSE, silent = TRUE, tryfast = FALSE)
findroot(x, y, parallel = FALSE, silent = TRUE, tryfast = FALSE)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
parallel |
Logical input, if TRUE then parallel processing will be used (default=FALSE) |
silent |
Logical input, if TRUE then no details will be printed out during code execution (default=TRUE) |
tryfast |
Logical input, if TRUE then instead 'BEDE' will be used from IEFE algorithm instead of BESE (default=FALSE) |
The parallel=TRUE otpion must be used if length(x)>20000. The tryfast=TRUE can be used for big data sets, but BEDE is not so accuracy as BESE, so use it with caution.
A named vector with next components is returned:
x1 the left endpoint of the final interval of BESE or BEDE iterations
x2 the right endpoint of the final interval of BESE or BEDE iterations
chi the estimation of extreme as x-abscissa
chi the estimation of extreme as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
The 'yvalue' at output vector is an interpolation approxiamtion for the y-value of unknown function at its extreme point 'chi' and does not mean that it will be certainly accurate. Thta is the truth if underlying function can be well approximated by low order polynomials.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
# ## Legendre polynomial 5th order f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(0.2,0.8,0.001);y=f(x);ya=abs(y) plot(x,y,pch=19,cex=0.5,ylim=c(min(y),max(ya))) abline(h=0); lines(x,ya,lwd=4,col='blue') rt=findroot(x,y) rt ## x1 x2 chi yvalue ## 5.370000e-01 5.400000e-01 5.385000e-01 -7.442574e-05 abline(v=rt['chi']) abline(v=rt[1:2],lty=2);abline(h=rt['yvalue'],lty=2) points(rt[3],rt[4],pch=17,col='blue',cex=2) # ## Same curve but with noise from U(-0.5,0.5) # set.seed(2019-07-24);r=0.05;y=f(x)+runif(length(x),-r,r) ya=abs(y) plot(x,y,pch=19,cex=0.5,ylim=c(min(y),max(ya))) abline(h=0) points(x,ya,pch=19,cex=0.5,col='blue') rt=findroot(x,y) rt ## x1 x2 chi yvalue ## 0.53400000 0.53700000 0.53550000 -0.01762159 abline(v=rt['chi']) abline(v=rt[1:2],lty=2);abline(h=rt['yvalue'],lty=2) points(rt[3],rt[4],pch=17,col='blue',cex=2) #
# ## Legendre polynomial 5th order f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(0.2,0.8,0.001);y=f(x);ya=abs(y) plot(x,y,pch=19,cex=0.5,ylim=c(min(y),max(ya))) abline(h=0); lines(x,ya,lwd=4,col='blue') rt=findroot(x,y) rt ## x1 x2 chi yvalue ## 5.370000e-01 5.400000e-01 5.385000e-01 -7.442574e-05 abline(v=rt['chi']) abline(v=rt[1:2],lty=2);abline(h=rt['yvalue'],lty=2) points(rt[3],rt[4],pch=17,col='blue',cex=2) # ## Same curve but with noise from U(-0.5,0.5) # set.seed(2019-07-24);r=0.05;y=f(x)+runif(length(x),-r,r) ya=abs(y) plot(x,y,pch=19,cex=0.5,ylim=c(min(y),max(ya))) abline(h=0) points(x,ya,pch=19,cex=0.5,col='blue') rt=findroot(x,y) rt ## x1 x2 chi yvalue ## 0.53400000 0.53700000 0.53550000 -0.01762159 abline(v=rt['chi']) abline(v=rt[1:2],lty=2);abline(h=rt['yvalue'],lty=2) points(rt[3],rt[4],pch=17,col='blue',cex=2) #
It takes as input the x, y numeric vectors, the indices for the range to be searched plus some other
options and finds the inflection point for that interval, while it plots data, Taylor polynomial and and the computed coefficients.
inflexi(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
inflexi(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
x |
A numeric vector for the independent variable |
y |
A numeric vector for the dependent variable |
i1 |
The first index for choosing a specific interval |
i2 |
The second index for choosing a specific interval |
nt |
The degree of the Taylor polynomial that will be fitted to the data |
alpha |
The level of statistical significance for the confidence intervals of coefficients |
xlb |
A label for the x-variable (default value = "x") |
ylb |
A label for the y-variable (default value = "y") |
xnd |
The number of digits for plotting the x-axis (default value = 3) |
ynd |
The number of digits for plotting the y-axis (default value = 3) |
plots |
If plots=TRUE then a plot is created on default monitor (default value = TRUE) |
plotpdf |
If plotpdf=TRUE then a pdf plot is created and stored on working directory (default value = FALSE) |
doparallel |
If doparallel=TRUE then parallel computing is applied, based on the available workers of current machine (default value = FALSE) |
The point which makes the relevant
minimum is the estimation for the function's inflection point at the interval
.
It returns an environment with two components:
an |
a matrix with 3 columns: lower, upper bound of confidence interval and middle value for each coefficient an |
fextr |
a list with 2 members: the position i and the value of the estimated inflection point |
When you are using RStudio it is necessary to leave enough space for the plot window in order for the plots to appear normally.
The data should come from a function at least in order to be able to find an inflection point, if exists.
Demetris T. Christopoulos
Demetris T. Christopoulos (2014). Roots, extrema and inflection points by using a proper Taylor regression procedure. SSRN. https://dx.doi.org/10.2139/ssrn.2521403
#Load data: # data(xydat) # #Extract x and y variables: # x=xydat$x;y=xydat$y # #Find inflection point, plot results, print Taylor coefficients and rho estimation: # d<-inflexi(x,y,1,length(x),5,5,plots=TRUE);d$an;d$finfl; # #Find multiple inflection points. #Let's create some data: # f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(101,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y) # #The first inflection point is d1<-inflexi(x,y,20,50,5,5,plots=TRUE);d1$an;d1$finfl; # 2.5 % 97.5 % an # a0 0.1483905 0.2377617 0.193076089 # a1 2.9024852 3.0936024 2.998043835 # a2 -0.2053120 0.2220390 0.008363525 # a3 -0.5845597 -0.3426017 -0.463580702 # a4 -0.2431038 0.1136244 -0.064739689 # a5 -0.0893246 0.0687848 -0.010269897 # [1] 19.000000 3.493296 #Compare it with the actual rho_1=3.429203673 # #The second inflection point is # d2<-inflexi(x,y,50,length(x),5,5,plots=TRUE);d2$an;d2$finfl; # 2.5 % 97.5 % an # a0 -0.000875677 0.057156356 0.0281403394 # a1 -3.058363342 -2.942026810 -3.0001950762 # a2 -0.056224101 0.044135857 -0.0060441222 # a3 0.433135897 0.528446241 0.4807910691 # a4 -0.011774733 0.012002414 0.0001138404 # a5 -0.026899286 -0.009520899 -0.0182100925 # [1] 23.000000 6.567948 #You have to compare it with the actual value of rho_2=6.570796327
#Load data: # data(xydat) # #Extract x and y variables: # x=xydat$x;y=xydat$y # #Find inflection point, plot results, print Taylor coefficients and rho estimation: # d<-inflexi(x,y,1,length(x),5,5,plots=TRUE);d$an;d$finfl; # #Find multiple inflection points. #Let's create some data: # f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(101,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y) # #The first inflection point is d1<-inflexi(x,y,20,50,5,5,plots=TRUE);d1$an;d1$finfl; # 2.5 % 97.5 % an # a0 0.1483905 0.2377617 0.193076089 # a1 2.9024852 3.0936024 2.998043835 # a2 -0.2053120 0.2220390 0.008363525 # a3 -0.5845597 -0.3426017 -0.463580702 # a4 -0.2431038 0.1136244 -0.064739689 # a5 -0.0893246 0.0687848 -0.010269897 # [1] 19.000000 3.493296 #Compare it with the actual rho_1=3.429203673 # #The second inflection point is # d2<-inflexi(x,y,50,length(x),5,5,plots=TRUE);d2$an;d2$finfl; # 2.5 % 97.5 % an # a0 -0.000875677 0.057156356 0.0281403394 # a1 -3.058363342 -2.942026810 -3.0001950762 # a2 -0.056224101 0.044135857 -0.0060441222 # a3 0.433135897 0.528446241 0.4807910691 # a4 -0.011774733 0.012002414 0.0001138404 # a5 -0.026899286 -0.009520899 -0.0182100925 # [1] 23.000000 6.567948 #You have to compare it with the actual value of rho_2=6.570796327
It takes as input the x, y numeric vectors, the indices for the range to be searched plus some other
options and finds the root, extreme and inflection for that interval, while it plots data,
Taylor polynomial and and the computed ,
,
coefficients.
rootexinf(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
rootexinf(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
x |
A numeric vector for the independent variable |
y |
A numeric vector for the dependent variable |
i1 |
The first index for choosing a specific interval |
i2 |
The second index for choosing a specific interval |
nt |
The degree of the Taylor polynomial that will be fitted to the data |
alpha |
The level of statistical significance for the confidence intervals of coefficients |
xlb |
A label for the x-variable (default value = "x") |
ylb |
A label for the y-variable (default value = "y") |
xnd |
The number of digits for plotting the x-axis (default value = 3) |
ynd |
The number of digits for plotting the y-axis (default value = 3) |
plots |
If plots=TRUE then a plot is created on default monitor (default value = TRUE) |
plotpdf |
If plotpdf=TRUE then a pdf plot is created and stored on working directory (default value = FALSE) |
doparallel |
If doparallel=TRUE then parallel computing is applied, based on the available workers of current machine (default value = FALSE) |
The points that make the relevant
,
,
minimum are the estimations
for the function's root, etreme and inflection point at the interval
.
It returns an environment with four components:
an0 |
a matrix with 3 columns: lower, upper bound of confidence interval and middle value for each coefficient a_n at the best choice in root searching |
an1 |
a matrix with 3 columns: lower, upper bound of confidence interval and middle value for each coefficient a_n at the best choice in extreme searching |
an2 |
a matrix with 3 columns: lower, upper bound of confidence interval and middle value for each coefficient a_n at the best choice in inflection searching |
frexinf |
a 3 x 3 matrix: for each row (root, extreme, inflection) the position i and the value of the estimated root, extreme and inflection |
When you are using RStudio it is necessary to leave enough space for the plot window in order for the plots to appear normally.
The data should come from a function at least in order to find the root, extreme and inflection point, provided those points exist.
Demetris T. Christopoulos
Demetris T. Christopoulos (2014). Roots, extrema and inflection points by using a proper Taylor regression procedure. SSRN. https://dx.doi.org/10.2139/ssrn.2521403
#Load data: #Let's create some data: f=function(x){3*cos(x-5)+1.5};xa=1.;xb=5; set.seed(12345);x=sort(runif(5001,xa,xb)); r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y);abline(h=0) #a<-rootexinf(x,y,1,length(x),5,plotpdf = TRUE,doparallel = TRUE);a$an0;a$an1;a$an2;a$frexinf; # Available workers are 12 # Time difference of 13.02153 secs # File 'root_extreme_inflection_plot.pdf' has been created # 2.5 % 97.5 % an0 # a0 -0.004165735 0.001838624 -0.001163555 # a1 2.588990973 2.600915136 2.594953055 # a2 0.731456294 0.741262772 0.736359533 # a3 -0.435591038 -0.423837041 -0.429714040 # a4 -0.052926049 -0.050039975 -0.051483012 # a5 0.017915715 0.020538155 0.019226935 # 2.5 % 97.5 % an1 # a0 -1.507117843 -1.500375848 -1.5037468451 # a1 -0.008343275 0.007916087 -0.0002135941 # a2 1.519432687 1.534103788 1.5267682378 # a3 -0.017663080 0.007780728 -0.0049411760 # a4 -0.159461025 -0.144303367 -0.1518821962 # a5 0.017915715 0.020538155 0.0192269354 # 2.5 % 97.5 % an2 # a0 1.503394727 1.509925166 1.5066599466 # a1 2.985374546 2.995259021 2.9903167834 # a2 -0.009041165 0.005898692 -0.0015712367 # a3 -0.489107253 -0.480579585 -0.4848434187 # a4 -0.003885327 0.002364758 -0.0007602842 # a5 0.017915715 0.020538155 0.0192269354 # index value # root 2364 2.903791 # extreme 1057 1.859431 # inflection 3038 3.431413 # You have to compare with the exact values # root=2.905604898 # extreme=1.858407346 # inflection=3.429203673
#Load data: #Let's create some data: f=function(x){3*cos(x-5)+1.5};xa=1.;xb=5; set.seed(12345);x=sort(runif(5001,xa,xb)); r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y);abline(h=0) #a<-rootexinf(x,y,1,length(x),5,plotpdf = TRUE,doparallel = TRUE);a$an0;a$an1;a$an2;a$frexinf; # Available workers are 12 # Time difference of 13.02153 secs # File 'root_extreme_inflection_plot.pdf' has been created # 2.5 % 97.5 % an0 # a0 -0.004165735 0.001838624 -0.001163555 # a1 2.588990973 2.600915136 2.594953055 # a2 0.731456294 0.741262772 0.736359533 # a3 -0.435591038 -0.423837041 -0.429714040 # a4 -0.052926049 -0.050039975 -0.051483012 # a5 0.017915715 0.020538155 0.019226935 # 2.5 % 97.5 % an1 # a0 -1.507117843 -1.500375848 -1.5037468451 # a1 -0.008343275 0.007916087 -0.0002135941 # a2 1.519432687 1.534103788 1.5267682378 # a3 -0.017663080 0.007780728 -0.0049411760 # a4 -0.159461025 -0.144303367 -0.1518821962 # a5 0.017915715 0.020538155 0.0192269354 # 2.5 % 97.5 % an2 # a0 1.503394727 1.509925166 1.5066599466 # a1 2.985374546 2.995259021 2.9903167834 # a2 -0.009041165 0.005898692 -0.0015712367 # a3 -0.489107253 -0.480579585 -0.4848434187 # a4 -0.003885327 0.002364758 -0.0007602842 # a5 0.017915715 0.020538155 0.0192269354 # index value # root 2364 2.903791 # extreme 1057 1.859431 # inflection 3038 3.431413 # You have to compare with the exact values # root=2.905604898 # extreme=1.858407346 # inflection=3.429203673
It takes as input the x, y numeric vectors, the indices for the range to be searched plus some other
options and finds the root for that interval, while it plots data, Taylor polynomial and and the computed coefficients.
rootxi(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
rootxi(x, y, i1, i2, nt, alpha = 5, xlb = "x", ylb = "y", xnd = 3, ynd = 3, plots = TRUE, plotpdf = FALSE, doparallel=FALSE)
x |
A numeric vector for the independent variable |
y |
A numeric vector for the dependent variable |
i1 |
The first index for choosing a specific interval |
i2 |
The second index for choosing a specific interval |
nt |
The degree of the Taylor polynomial that will be fitted to the data |
alpha |
The level of statistical significance for the confidence intervals of coefficients |
xlb |
A label for the x-variable (default value = "x") |
ylb |
A label for the y-variable (default value = "y") |
xnd |
The number of digits for plotting the x-axis (default value = 3) |
ynd |
The number of digits for plotting the y-axis (default value = 3) |
plots |
If plots=TRUE then a plot is created on default monitor (default value = TRUE) |
plotpdf |
If plotpdf=TRUE then a pdf plot is created and stored on working directory (default value = FALSE) |
doparallel |
If doparallel=TRUE then parallel computing is applied, based on the available workers of current machine (default value = FALSE) |
The point which makes the relevant
minimum is the estimation for the function's root at the interval
.
It returns an environment with two components:
an |
a matrix with 3 columns: lower, upper bound of confidence interval and middle value for each coefficient a_n |
froot |
a list with 2 members: the position i and the value of the estimated root |
When you are using RStudio it is necessary to leave enough space for the plot window in order for the plots to appear normally.
The data should come from a function at least in order to find the root, provided that such a root exists.
Demetris T. Christopoulos
Demetris T. Christopoulos (2014). Roots, extrema and inflection points by using a proper Taylor regression procedure. SSRN. https://dx.doi.org/10.2139/ssrn.2521403
#Load data: # data(xydat) # #Extract x and y variables: # x=xydat$x;y=xydat$y # #Find root, plot results, print Taylor coefficients and rho estimation: # b<-rootxi(x,y,1,length(x),5,5,plots=TRUE);b$an;b$froot; # #Find multiple roots. #Let's create some data: # f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(101,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y) # #The first root is # b1<-rootxi(x,y,1,20,5,5,plots=TRUE);b1$an;b1$froot; # 2.5 % 97.5 % an # a0 -0.09380972 0.03295954 -0.03042509 # a1 -3.63025679 -2.89908741 -3.26467210 # a2 -0.90435090 0.80658742 -0.04888174 # a3 -1.27911360 6.88168053 2.80128346 # a4 -8.77763032 2.51983279 -3.12889877 # a5 -1.10798564 3.38419904 1.13810670 # [1] 5.0000000 0.3108189 #Compare it with the actual rho_1=0.2876110196 # #The second root is # b2<-rootxi(x,y,20,50,5,5,plots=TRUE);b2$an;b2$froot; # 2.5 % 97.5 % an # a0 0.1483905 0.2377617 0.193076089 # a1 2.9024852 3.0936024 2.998043835 # a2 -0.2053120 0.2220390 0.008363525 # a3 -0.5845597 -0.3426017 -0.463580702 # a4 -0.2431038 0.1136244 -0.064739689 # a5 -0.0893246 0.0687848 -0.010269897 # [1] 19.000000 3.493296 #You have to compare it with the actual value of rho_2=3.429203673 # #Finally the third root is b3<-rootxi(x,y,50,90,5,5,plots=TRUE);b3$an;b3$froot; # 2.5 % 97.5 % an # a0 -0.002269152 0.058784414 0.0282576308 # a1 -3.090980046 -2.938875341 -3.0149276930 # a2 -0.089893659 0.075094637 -0.0073995112 # a3 0.403040978 0.591836654 0.4974388159 # a4 -0.035442477 0.037165754 0.0008616385 # a5 -0.048414145 0.005815106 -0.0212995192 # [1] 23.000000 6.567948 #You have to compare it with the actual value of rho_3=6.570796327
#Load data: # data(xydat) # #Extract x and y variables: # x=xydat$x;y=xydat$y # #Find root, plot results, print Taylor coefficients and rho estimation: # b<-rootxi(x,y,1,length(x),5,5,plots=TRUE);b$an;b$froot; # #Find multiple roots. #Let's create some data: # f=function(x){3*cos(x-5)};xa=0.;xb=9; set.seed(12345);x=sort(runif(101,xa,xb));r=0.1;y=f(x)+2*r*(runif(length(x))-0.5);plot(x,y) # #The first root is # b1<-rootxi(x,y,1,20,5,5,plots=TRUE);b1$an;b1$froot; # 2.5 % 97.5 % an # a0 -0.09380972 0.03295954 -0.03042509 # a1 -3.63025679 -2.89908741 -3.26467210 # a2 -0.90435090 0.80658742 -0.04888174 # a3 -1.27911360 6.88168053 2.80128346 # a4 -8.77763032 2.51983279 -3.12889877 # a5 -1.10798564 3.38419904 1.13810670 # [1] 5.0000000 0.3108189 #Compare it with the actual rho_1=0.2876110196 # #The second root is # b2<-rootxi(x,y,20,50,5,5,plots=TRUE);b2$an;b2$froot; # 2.5 % 97.5 % an # a0 0.1483905 0.2377617 0.193076089 # a1 2.9024852 3.0936024 2.998043835 # a2 -0.2053120 0.2220390 0.008363525 # a3 -0.5845597 -0.3426017 -0.463580702 # a4 -0.2431038 0.1136244 -0.064739689 # a5 -0.0893246 0.0687848 -0.010269897 # [1] 19.000000 3.493296 #You have to compare it with the actual value of rho_2=3.429203673 # #Finally the third root is b3<-rootxi(x,y,50,90,5,5,plots=TRUE);b3$an;b3$froot; # 2.5 % 97.5 % an # a0 -0.002269152 0.058784414 0.0282576308 # a1 -3.090980046 -2.938875341 -3.0149276930 # a2 -0.089893659 0.075094637 -0.0073995112 # a3 0.403040978 0.591836654 0.4974388159 # a4 -0.035442477 0.037165754 0.0008616385 # a5 -0.048414145 0.005815106 -0.0212995192 # [1] 23.000000 6.567948 #You have to compare it with the actual value of rho_3=6.570796327
Given a not noisy planar curve as a set of discrete points we use Integration Root Finding Estimator (IRFE), Integration Extreme Finding Estimator (IEFE) and BESE in order to find all roots and the enclosed between them extrema and inflction points. Estimators are defined and described at [1] and [2], [3].
scan_curve(x, y, findroots = TRUE, findextremes = TRUE, findinflections = TRUE, silent = FALSE, plots = TRUE)
scan_curve(x, y, findroots = TRUE, findextremes = TRUE, findinflections = TRUE, silent = FALSE, plots = TRUE)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
findroots |
Logical input, if TRUE then find all existing roots (default=TRUE) |
findextremes |
Logical input, if TRUE then find all existing extrema between the found roots (default=TRUE) |
findinflections |
Logical input, if TRUE then find all existing inflection points between the found roots (default=TRUE) |
silent |
Logical input, if TRUE then no details will be printed out during code execution (default=TRUE) |
plots |
Logical input, if TRUE then a plot with all roots, extrema and inflctions will be created (default=TRUE) |
The function first makes a study for the curve based on the interval classification done by absolute y-values. Then it uses an extensive if-else environment in order to cover all possible cases without error breaks.
A list with next memebers is returned:
study a data frame with all intervals that curve can be divided and next columns:
x the root estimation taken from absolute value
y the y-value for root estimation x
y the absolute y-value for root estimation x
zero if TRUE, then all values of transformed yi's are zero for current interval
dif monotonicty index, if it is +1 (-1) then curve is increasing (decreasing)at root x
ja the index of x vector for the left endpoint of current interval
jb the index of x vector for the right endpoint of current interval
root_monotonicity monotonicty characterization for current root x
extremity extremity characterization for current interval
sigmoidicity sigmoidicity characterization for current interval
roots a data frame with all roots and next columns:
x1 the left endpoint of the final interval of BESE iterations
x2 the right endpoint of the final interval of BESE iterations
chi the estimation of root as x-abscissa
chi the estimation of root as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
extremes a data frame with all extremes between roots and next columns:
x1 the left endpoint of the final interval of BESE iterations
x2 the right endpoint of the final interval of BESE iterations
chi the estimation of extreme as x-abscissa
chi the estimation of extreme as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
inflections a data frame with all inflections between roots and next columns:
x1 the left endpoint of the final interval of BESE iterations
x2 the right endpoint of the final interval of BESE iterations
chi the estimation of inflection as x-abscissa
chi the estimation of inflection as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
A heuristic is first used for determination of noise: if curve is classified as a noisy one, then only 'study' and a rough plot are available.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
[2]Demetris T. Christopoulos (2014). Developing methods for identifying the inflection point of a convex/concave curve. arXiv:1206.5478v2 [math.NA]. https://arxiv.org/pdf/1206.5478v2.pdf
[3]Demetris T. Christopoulos (2016). On the efficient identification of an inflection point.International Journal of Mathematics and Scientific Computing, (ISSN: 2231-5330), vol. 6(1). https://veltech.edu.in/wp-content/uploads/2016/04/Paper-04-2016.pdf
scan_noisy_curve
, classify_curve
# ## Legendre polynomial 5th order f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(-1,1,0.001);y=f(x) plot(x,y,pch=19,cex=0.5) abline(h=0) rall=scan_curve(x,y) rall$study rall$roots ## x1 x2 chi yvalue ## [1,] -0.907 -0.905 -9.060000e-01 1.234476e-03 ## [2,] -0.540 -0.537 -5.385000e-01 7.447856e-05 ## [3,] -0.001 0.001 5.551115e-17 1.040844e-16 ## [4,] 0.537 0.540 5.385000e-01 -7.444324e-05 ## [5,] 0.905 0.907 9.060000e-01 -1.234476e-03 rall$extremes ## x1 x2 chi yvalue ## [1,] -0.766 -0.764 -0.765 0.4196969 ## [2,] -0.286 -0.284 -0.285 -0.3466274 ## [3,] 0.284 0.286 0.285 0.3466274 ## [4,] 0.764 0.766 0.765 -0.4196969 rall$inflections ## x1 x2 chi yvalue ## [1,] -0.579 -0.576 -5.775000e-01 9.659939e-02 ## [2,] -0.001 0.001 5.551115e-17 1.040829e-16 ## [3,] 0.576 0.579 5.775000e-01 -9.659935e-02 #
# ## Legendre polynomial 5th order f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(-1,1,0.001);y=f(x) plot(x,y,pch=19,cex=0.5) abline(h=0) rall=scan_curve(x,y) rall$study rall$roots ## x1 x2 chi yvalue ## [1,] -0.907 -0.905 -9.060000e-01 1.234476e-03 ## [2,] -0.540 -0.537 -5.385000e-01 7.447856e-05 ## [3,] -0.001 0.001 5.551115e-17 1.040844e-16 ## [4,] 0.537 0.540 5.385000e-01 -7.444324e-05 ## [5,] 0.905 0.907 9.060000e-01 -1.234476e-03 rall$extremes ## x1 x2 chi yvalue ## [1,] -0.766 -0.764 -0.765 0.4196969 ## [2,] -0.286 -0.284 -0.285 -0.3466274 ## [3,] 0.284 0.286 0.285 0.3466274 ## [4,] 0.764 0.766 0.765 -0.4196969 rall$inflections ## x1 x2 chi yvalue ## [1,] -0.579 -0.576 -5.775000e-01 9.659939e-02 ## [2,] -0.001 0.001 5.551115e-17 1.040829e-16 ## [3,] 0.576 0.579 5.775000e-01 -9.659935e-02 #
Given a noisy planar curve as a set of discrete points we use Integration Root Finding Estimator (IRFE), Integration Extreme Finding Estimator (IEFE) and BESE in order to find all roots and the enclosed between them extrema and inflction points. Estimators are defined and described at [1] and [2], [3].
scan_noisy_curve(x, y, noise = NULL, rootsoptim = TRUE, findextremes = TRUE, findinflections = TRUE, silent = FALSE, plots = TRUE)
scan_noisy_curve(x, y, noise = NULL, rootsoptim = TRUE, findextremes = TRUE, findinflections = TRUE, silent = FALSE, plots = TRUE)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
noise |
Either NULL (default value) or TRUE/FALSE input for suggesting that curve is indeed a noisy one |
rootsoptim |
Logical input, if TRUE then IRFE algorithm will also be used for roots (default=TRUE) |
findextremes |
Logical input, if TRUE then find all existing extrema between the found roots (default=TRUE) |
findinflections |
Logical input, if TRUE then find all existing inflection points between the found roots (default=TRUE) |
silent |
Logical input, if TRUE then no details will be printed out during code execution (default=TRUE) |
plots |
Logical input, if TRUE then a plot with all roots, extrema and inflctions will be created (default=TRUE) |
The function first uses scan_curve
in norder to perform a first study. Then it uses an extesnsive if-else environment in order to cover all possible cases without error breaks.
A list with next memebers is returned:
study a data frame with all intervals that curve can be divided and next columns:
j the index of x vector for the left endpoint of current interval
dj the number of x points of current interval
interval logical, if TRUE then it is a unique convexity interval
i1 the index of x vector for the left endpoint of current interval
i2 the index of x vector for the right endpoint of current interval
interval logical, if TRUE then a root exists inside current interval
roots_average a data frame with all averaged roots and next columns:
x1 the left endpoint of the averaged interval
x2 the right endpoint of the averaged interval
chi the estimation of root as x-abscissa
chi the estimation of root as y-abscissa taken from the interpolation polynomial of 2nd degree for a properly collected triad of (x[i],y[i]) points
roots_optim a data frame with all roots from IRFE and next columns:
x1 the left endpoint of the final interval of BESE iterations
x2 the right endpoint of the final interval of BESE iterations
chi the estimation of root as x-abscissa
chi the estimation of root as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
extremes a data frame with all extremes between roots and next columns:
x1 the left endpoint of the final interval of BESE iterations
x2 the right endpoint of the final interval of BESE iterations
chi the estimation of extreme as x-abscissa
chi the estimation of extreme as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
inflections a data frame with all inflections between roots and next columns:
x1 the left endpoint of the final interval of BESE iterations
x2 the right endpoint of the final interval of BESE iterations
chi the estimation of inflection as x-abscissa
chi the estimation of inflection as y-abscissa taken from the interpolation polynomial of 2nd degree for the data points (x1,y1), (x2,y2), (chi,ychi)
If curve is not a noisy one, then scan_curve
is used.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
[2]Demetris T. Christopoulos (2014). Developing methods for identifying the inflection point of a convex/concave curve. arXiv:1206.5478v2 [math.NA]. https://arxiv.org/pdf/1206.5478v2.pdf
[3]Demetris T. Christopoulos (2016). On the efficient identification of an inflection point.International Journal of Mathematics and Scientific Computing, (ISSN: 2231-5330), vol. 6(1). https://veltech.edu.in/wp-content/uploads/2016/04/Paper-04-2016.pdf
# ## Legendre polynomial 5th order f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(-1,1,0.001) set.seed(2019-07-26);r=0.05;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) rn=scan_noisy_curve(x,y) rn ## $study ## j dj interval i1 i2 root ## 3 97 351 TRUE 97 448 FALSE ## 18 477 502 TRUE 477 979 FALSE ## 39 1021 505 TRUE 1021 1526 FALSE ## 54 1558 343 TRUE 1558 1901 FALSE ## ## $roots_average ## x1 x2 chi yvalue ## 1 -0.906 -0.904 -0.9050 -0.002342389 ## 2 -0.553 -0.524 -0.5385 0.005003069 ## 3 -0.022 0.020 -0.0010 0.003260937 ## 4 0.525 0.557 0.5410 -0.007956680 ## 5 0.900 0.911 0.9055 -0.008015683 ## ## $roots_optim ## x1 x2 chi yvalue ## 1 -0.909 -0.901 -0.9050 -0.023334404 ## 2 -0.531 -0.527 -0.5290 0.029256059 ## 3 0.001 0.003 0.0020 0.001990572 ## 4 0.530 0.565 0.5475 0.019616283 ## 5 0.909 0.912 0.9105 0.009288338 ## ## $extremes ## x1 x2 chi yvalue ## [1,] -0.773 -0.766 -0.7695 0.4102010 ## [2,] -0.280 -0.274 -0.2770 -0.3804006 ## [3,] 0.308 0.316 0.3120 0.3372764 ## [4,] 0.741 0.744 0.7425 -0.4414494 ## ## $inflections ## x1 x2 chi yvalue ## [1,] -0.772 -0.275 -0.5235 -0.076483193 ## [2,] -0.275 0.281 0.0030 -0.007558037 ## [3,] 0.301 0.776 0.5385 0.018958334 #
# ## Legendre polynomial 5th order f=function(x){(63/8)*x^5-(35/4)*x^3+(15/8)*x} x=seq(-1,1,0.001) set.seed(2019-07-26);r=0.05;y=f(x)+runif(length(x),-r,r) plot(x,y,pch=19,cex=0.5) rn=scan_noisy_curve(x,y) rn ## $study ## j dj interval i1 i2 root ## 3 97 351 TRUE 97 448 FALSE ## 18 477 502 TRUE 477 979 FALSE ## 39 1021 505 TRUE 1021 1526 FALSE ## 54 1558 343 TRUE 1558 1901 FALSE ## ## $roots_average ## x1 x2 chi yvalue ## 1 -0.906 -0.904 -0.9050 -0.002342389 ## 2 -0.553 -0.524 -0.5385 0.005003069 ## 3 -0.022 0.020 -0.0010 0.003260937 ## 4 0.525 0.557 0.5410 -0.007956680 ## 5 0.900 0.911 0.9055 -0.008015683 ## ## $roots_optim ## x1 x2 chi yvalue ## 1 -0.909 -0.901 -0.9050 -0.023334404 ## 2 -0.531 -0.527 -0.5290 0.029256059 ## 3 0.001 0.003 0.0020 0.001990572 ## 4 0.530 0.565 0.5475 0.019616283 ## 5 0.909 0.912 0.9105 0.009288338 ## ## $extremes ## x1 x2 chi yvalue ## [1,] -0.773 -0.766 -0.7695 0.4102010 ## [2,] -0.280 -0.274 -0.2770 -0.3804006 ## [3,] 0.308 0.316 0.3120 0.3372764 ## [4,] 0.741 0.744 0.7425 -0.4414494 ## ## $inflections ## x1 x2 chi yvalue ## [1,] -0.772 -0.275 -0.5235 -0.076483193 ## [2,] -0.275 0.281 0.0030 -0.007558037 ## [3,] 0.301 0.776 0.5385 0.018958334 #
Function uses classify_curve
and then either findmaxbell
or findmaxtulip
to proceed. See [1] for definitions and details of algorithms.
symextreme(x, y, concave = NULL, type = NULL)
symextreme(x, y, concave = NULL, type = NULL)
x |
A numeric vector for the independent variable without missing values |
y |
A numeric vector for the dependent variable without missing values |
concave |
Logical input, if TRUE then curve is supposed to have a maximum (default=TRUE) |
type |
A character string inpute denoting the shape of the curve, either 'bell' or 'tulip' (default=NULL) |
This function is useful if we know that our curve has a symmetry around its extreme point but we cannot directly infer for the relevant shape.
A list with next memebers is returned:
maximum logical, if TRUE then curve has a maximum
minimum logical, if TRUE then curve has a minimum
results a named vector with components:
j1 the index of x-left
j2 the index of x-right
chi the estimation of extreme as x-abscissa
You can Use the 'type' input if you are sure for the shape of the curve.
Demetris T. Christopoulos
[1]Demetris T. Christopoulos (2019). New methods for computing extremes and roots of a planar curve: introducing Noisy Numerical Analysis (2019). ResearchGate. http://dx.doi.org/10.13140/RG.2.2.17158.32324
classify_curve
, findmaxtulip
, findmaxbell
, findextreme
# ## Bell curve f=function(x){1/(1+x^2)} x=seq(-2,2.0,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) a=symextreme(x,y) a ## $maximum ## [1] TRUE ## ## $minimum ## [1] FALSE ## ## $results ## j1 j2 chi ## 1.770000e+02 2.250000e+02 1.110223e-16 abline(v=a$results['chi']) # ## Tulip curve f=function(x){100-(x-5)^2} x=seq(0,12,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) a=symextreme(x,y) a ## $maximum ## [1] TRUE ## ## $minimum ## [1] FALSE ## ## $results ## j1 j2 chi ## 1 1001 5 abline(v=a$results['chi']) #
# ## Bell curve f=function(x){1/(1+x^2)} x=seq(-2,2.0,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) a=symextreme(x,y) a ## $maximum ## [1] TRUE ## ## $minimum ## [1] FALSE ## ## $results ## j1 j2 chi ## 1.770000e+02 2.250000e+02 1.110223e-16 abline(v=a$results['chi']) # ## Tulip curve f=function(x){100-(x-5)^2} x=seq(0,12,by=0.01);y=f(x) plot(x,y,pch=19,cex=0.5) a=symextreme(x,y) a ## $maximum ## [1] TRUE ## ## $minimum ## [1] FALSE ## ## $results ## j1 j2 chi ## 1 1001 5 abline(v=a$results['chi']) #
A dataset containing 61 xy-points
data("xydat")
data("xydat")
A data frame with 61 observations on the following 2 variables.
x
a numeric vector
y
a numeric vector
data(xydat)
data(xydat)