Source code for streng.common.math.numerical

import numpy as np


[docs]def area_under_curve(x, y, x_start, x_end): x_new, y_new = xy_with_endpoints(x, y, x_start, x_end) res = np.trapz(y=y_new, x=x_new) return res
[docs]def xy_with_endpoints(x, y, x_start, x_end): if x_start <= x[0]: x_start = x[0] if x_end >= x[-1]: x_end = x[-1] # # Για την αρχή # y_start = float(np.interp(x_start, x, y)) # # Κρατώ μόνο τις τιμές μετά από το x_start # _x = x[(x > x_start)] # _y = y[len(y) - len(_x):len(y)] # # Προσθέτω τα x, y της παρεμβολής # _x = np.append(x_start, _x) # _y = np.append(y_start, _y) # # # Για το τέλος # y_end = float(np.interp(x_end, x, y)) # # Κρατώ μόνο τις τιμές μέχρι μία πρίν από το x_end # _x = _x[(_x < x_end)] # _y = _y[0:len(_x)] # # Προσθέτω τα x, y της παρεμβολής # _x = np.append(_x, x_end) # _y = np.append(_y, y_end) _x = x[(x >= x_start)] _x = _x[(_x <= x_end)] _y = np.interp(_x, x, y) return _x, _y
def _rect_inter_inner(x1,x2): n1=x1.shape[0]-1 n2=x2.shape[0]-1 X1=np.c_[x1[:-1],x1[1:]] X2=np.c_[x2[:-1],x2[1:]] S1=np.tile(X1.min(axis=1),(n2,1)).T S2=np.tile(X2.max(axis=1),(n1,1)) S3=np.tile(X1.max(axis=1),(n2,1)).T S4=np.tile(X2.min(axis=1),(n1,1)) return S1,S2,S3,S4 def _rectangle_intersection_(x1,y1,x2,y2): S1,S2,S3,S4=_rect_inter_inner(x1,x2) S5,S6,S7,S8=_rect_inter_inner(y1,y2) C1=np.less_equal(S1,S2) C2=np.greater_equal(S3,S4) C3=np.less_equal(S5,S6) C4=np.greater_equal(S7,S8) ii,jj=np.nonzero(C1 & C2 & C3 & C4) return ii,jj
[docs]def intersection(x1,y1,x2,y2): """Copied from https://github.com/sukhbinder/intersection INTERSECTIONS Intersections of curves. Computes the (x,y) locations where two curves intersect. The curves can be broken with NaNs or have vertical segments. .. usage: x,y=intersection(x1,y1,x2,y2) Example: a, b = 1, 2 phi = np.linspace(3, 10, 100) x1 = a*phi - b*np.sin(phi) y1 = a - b*np.cos(phi) x2=phi y2=np.sin(phi)+2 x,y=intersection(x1,y1,x2,y2) plt.plot(x1,y1,c='r') plt.plot(x2,y2,c='g') plt.plot(x,y,'*k') plt.show() """ ii, jj = _rectangle_intersection_(x1, y1, x2, y2) n=len(ii) dxy1=np.diff(np.c_[x1,y1],axis=0) dxy2=np.diff(np.c_[x2,y2],axis=0) T=np.zeros((4,n)) AA=np.zeros((4,4,n)) AA[0:2,2,:]=-1 AA[2:4,3,:]=-1 AA[0::2,0,:]=dxy1[ii,:].T AA[1::2,1,:]=dxy2[jj,:].T BB=np.zeros((4,n)) BB[0,:]=-x1[ii].ravel() BB[1,:]=-x2[jj].ravel() BB[2,:]=-y1[ii].ravel() BB[3,:]=-y2[jj].ravel() for i in range(n): try: T[:,i]=np.linalg.solve(AA[:,:,i],BB[:,i]) except: T[:,i]=np.NaN in_range= (T[0,:] >=0) & (T[1,:] >=0) & (T[0,:] <=1) & (T[1,:] <=1) xy0=T[2:,in_range] xy0=xy0.T return xy0[:,0],xy0[:,1]