Module ambit_stochastics.helpers.adaptive_rejection_sampling_secanats
Created on Fri Sep 10 22:40:53 2021
@author: dleon
Expand source code
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 10 22:40:53 2021
@author: dleon
"""
import numpy as np
#values = f(y) where y= f(np.linspace(a,b,1000))
def secants(x,a,b,f,nr_values):
assert (a <= x and x <= b)
if x == a:
return f(a)
elif x == b:
return f(b)
increment = (b-a)/ (nr_values-1)
#a , a + i , a + 2*i ,..., a + nr_values * i
interval_index = int(np.floor((nr_values-1) * (x-a)/(b-a)))
return f(a + interval_index * increment) +\
(f((interval_index+1) * increment) - f(interval_index * increment)) * (x - a - interval_index * increment) / increment
def secants_old(x,a,b,values,f_values):
assert (a <= x and x <= b)
if x == a:
return f_values[0]
elif x == b:
return f_values[-1]
else:
increment = values[1]-values[0]
interval_index = int(np.floor((len(values)-1) * (x-a)/(b-a)))
#assert (x - values[interval_index] >= 0) and (values[interval_index+1] -x >= 0)
return f_values[interval_index] + (f_values[interval_index+1]-f_values[interval_index]) * (x - values[interval_index]) / increment
#### USAGE EXAMPLE####
f = lambda x : x**4 * (2-x)**1.25
a,b,nr_values = 0,1.25,3
values = np.linspace(a,b,nr_values)
f_values = f(values)
import matplotlib.pyplot as plt
z = np.linspace(a,b,100)
#zz = [secants_old(i,a,b,values,f_values) for i in z]
zz = [secants(i,a,b,f,nr_values) for i in z]
plt.plot(z,zz,c='b')
plt.plot(z,f(z),c='r')
#print ((zz - f(z) >= 0).all() )
Functions
def f(x)
-
Expand source code
f = lambda x : x**4 * (2-x)**1.25
def secants(x, a, b, f, nr_values)
-
Expand source code
def secants(x,a,b,f,nr_values): assert (a <= x and x <= b) if x == a: return f(a) elif x == b: return f(b) increment = (b-a)/ (nr_values-1) #a , a + i , a + 2*i ,..., a + nr_values * i interval_index = int(np.floor((nr_values-1) * (x-a)/(b-a))) return f(a + interval_index * increment) +\ (f((interval_index+1) * increment) - f(interval_index * increment)) * (x - a - interval_index * increment) / increment
def secants_old(x, a, b, values, f_values)
-
Expand source code
def secants_old(x,a,b,values,f_values): assert (a <= x and x <= b) if x == a: return f_values[0] elif x == b: return f_values[-1] else: increment = values[1]-values[0] interval_index = int(np.floor((len(values)-1) * (x-a)/(b-a))) #assert (x - values[interval_index] >= 0) and (values[interval_index+1] -x >= 0) return f_values[interval_index] + (f_values[interval_index+1]-f_values[interval_index]) * (x - values[interval_index]) / increment