master
pbrod 9 years ago
parent eca5368f75
commit 2c90a05f80

@ -160,6 +160,12 @@ class PlotData(object):
return interpolate.griddata(
self.args, self.data, points, **options)
def to_cdf(self):
if isinstance(self.args, (list, tuple)): # Multidimensional data
raise NotImplementedError('integration for ndim>1 not implemented')
cdf = np.hstack((0, integrate.cumtrapz(self.data, self.args)))
return PlotData(cdf, np.copy(self.args), xlab='x', ylab='F(x)')
def integrate(self, a, b, **kwds):
'''
>>> x = np.linspace(0,5,60)
@ -551,7 +557,7 @@ def plot2d(axis, wdata, plotflag, *args, **kwds):
clvec = np.sort(CL)
if plotflag in [1, 8, 9]:
h = axis.contour(*args1, levels=CL, **kwds)
h = axis.contour(*args1, levels=clvec, **kwds)
# else:
# [cs hcs] = contour3(f.x{:},f.f,CL,sym);
@ -563,9 +569,7 @@ def plot2d(axis, wdata, plotflag, *args, **kwds):
'Only the first 12 levels will be listed in table.')
clvals = PL[:ncl] if isPL else clvec[:ncl]
unused_axcl = cltext(
clvals,
percent=isPL) # print contour level text
unused_axcl = cltext(clvals, percent=isPL)
elif any(plotflag == [7, 9]):
axis.clabel(h)
else:

@ -1,6 +1,5 @@
from scipy import *
from pylab import *
import wafo.plotbackend.plotbackend as plt
import numpy as np
# pyreport -o chapter1.html chapter1.py
#! CHAPTER1 demonstrates some applications of WAFO
@ -21,10 +20,10 @@ from pylab import *
#! The following code generates 200 seconds of data sampled with 10Hz from
#! the Torsethaugen spectrum
import wafo.spectrum.models as wsm
S = wsm.Torsethaugen(Hm0=6, Tp=8);
S = wsm.Torsethaugen(Hm0=6, Tp=8)
S1 = S.tospecdata()
S1.plot()
show()
plt.show()
##
@ -32,7 +31,7 @@ import wafo.objects as wo
xs = S1.sim(ns=2000, dt=0.1)
ts = wo.mat2timeseries(xs)
ts.plot_wave('-')
show()
plt.show()
#! Estimation of spectrum
@ -40,15 +39,15 @@ show()
#! A common situation is that one wants to estimate the spectrum for wave
#! measurements. The following code simulate 20 minutes signal sampled at 4Hz
#! and compare the spectral estimate with the original Torsethaugen spectum.
clf()
Fs = 4;
xs = S1.sim(ns=fix(20 * 60 * Fs), dt=1. / Fs)
plt.clf()
Fs = 4
xs = S1.sim(ns=np.fix(20 * 60 * Fs), dt=1. / Fs)
ts = wo.mat2timeseries(xs)
Sest = ts.tospecdata(L=400)
S1.plot()
Sest.plot('--')
axis([0, 3, 0, 5]) # This may depend on the simulation
show()
plt.axis([0, 3, 0, 5])
plt.show()
#! Section 1.4.2 Probability distributions of wave characteristics.
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -58,7 +57,7 @@ show()
#! In the following example we study the trough period extracted from the
#! time series and compared with the theoretical density computed with exact
#! spectrum, S1, and the estimated spectrum, Sest.
clf()
plt.clf()
import wafo.misc as wm
dtyex = S1.to_t_pdf(pdef='Tt', paramt=(0, 10, 51), nit=3)
dtyest = Sest.to_t_pdf(pdef='Tt', paramt=(0, 10, 51), nit=3)
@ -69,27 +68,27 @@ wm.plot_histgrm(T, bins=bins, normed=True)
dtyex.plot()
dtyest.plot('-.')
axis([0, 10, 0, 0.35])
show()
plt.axis([0, 10, 0, 0.35])
plt.show()
#! Section 1.4.3 Directional spectra
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#! Here are a few lines of code, which produce directional spectra
#! with frequency independent and frequency dependent spreading.
clf()
plt.clf()
plotflag = 1
Nt = 101; # number of angles
th0 = pi / 2; # primary direction of waves
Sp = 15; # spreading parameter
Nt = 101 # number of angles
th0 = np.pi / 2 # primary direction of waves
Sp = 15 # spreading parameter
D1 = wsm.Spreading(type='cos', theta0=th0, method=None) # frequency independent
D12 = wsm.Spreading(type='cos', theta0=0, method='mitsuyasu') # frequency dependent
D1 = wsm.Spreading(type='cos', theta0=th0, method=None)
D12 = wsm.Spreading(type='cos', theta0=0, method='mitsuyasu')
SD1 = D1.tospecdata2d(S1)
SD12 = D12.tospecdata2d(S1)
SD1.plot()
SD12.plot() # linestyle='dashdot')
show()
plt.show()
#! 3D Simulation of the sea surface
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -164,30 +163,30 @@ show()
#! Section 1.4.5 Extreme value statistics
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot of yura87 data
clf()
plt.clf()
import wafo.data as wd
xn = wd.yura87()
#xn = load('yura87.dat');
subplot(211)
plot(xn[::30, 0] / 3600, xn[::30, 1], '.')
title('Water level')
ylabel('(m)')
plt.subplot(211)
plt.plot(xn[::30, 0] / 3600, xn[::30, 1], '.')
plt.title('Water level')
plt.ylabel('(m)')
#! Formation of 5 min maxima
yura = xn[:85500, 1]
yura = np.reshape(yura, (285, 300)).T
maxyura = yura.max(axis=0)
subplot(212)
plot(xn[299:85500:300, 0] / 3600, maxyura, '.')
xlabel('Time (h)')
ylabel('(m)')
title('Maximum 5 min water level')
show()
plt.subplot(212)
plt.plot(xn[299:85500:300, 0] / 3600, maxyura, '.')
plt.xlabel('Time (h)')
plt.ylabel('(m)')
plt.title('Maximum 5 min water level')
plt.show()
#! Estimation of GEV for yuramax
clf()
plt.clf()
import wafo.stats as ws
phat = ws.genextreme.fit2(maxyura, method='ml')
phat.plotfitsummary()
show()
plt.show()
#disp('Block = 11, Last block')

@ -1,6 +1,5 @@
import wafo.plotbackend.plotbackend as plt
import numpy as np
from scipy import *
from pylab import *
# pyreport -o chapter2.html chapter2.py
@ -37,7 +36,7 @@ tp = ts.turning_points()
cc = tp.cycle_pairs()
lc = cc.level_crossings()
lc.plot()
show()
plt.show()
#! Average number of upcrossings per time unit
#!----------------------------------------------
@ -45,7 +44,7 @@ show()
#! per time unit of the mean level (= 0); this may require interpolation in the
#! crossing intensity curve, as follows.
T = xx[:, 0].max() - xx[:, 0].min()
f0 = np.interp(0, lc.args, lc.data, 0) / T #! zero up-crossing frequency
f0 = np.interp(0, lc.args, lc.data, 0) / T # zero up-crossing frequency
print('f0 = %g' % f0)
#! Turningpoints and irregularity factor
@ -66,11 +65,11 @@ print('fm = %g, alpha = %g, ' % (fm, alfa))
#! non-linearities and narrow-bandedness of the data.
#! First we shall plot the data and zoom in on a specific region.
#! A part of sea data is visualized with the following commands
clf()
plt.clf()
ts.plot_wave('k-', tp, '*', nfig=1, nsub=1)
axis([0, 2, -2, 2])
show()
plt.axis([0, 2, -2, 2])
plt.show()
#! Finding possible spurious points
#!------------------------------------
@ -91,17 +90,17 @@ inds, indg = wm.findoutliers(ts.data, zcrit, dcrit, ddcrit, verbose=True)
#!----------------------------------------------------
#! Periodogram: Raw spectrum
#!
clf()
plt.clf()
Lmax = 9500
S = ts.tospecdata(L=Lmax)
S.plot()
axis([0, 5, 0, 0.7])
show()
plt.axis([0, 5, 0, 0.7])
plt.show()
#! Calculate moments
#!-------------------
mom, text = S.moment(nr=4)
print('sigma = %g, m0 = %g' % (sa, sqrt(mom[0])))
print('sigma = %g, m0 = %g' % (sa, np.sqrt(mom[0])))
#! Section 2.2.1 Random functions in Spectral Domain - Gaussian processes
#!--------------------------------------------------------------------------
@ -109,13 +108,14 @@ print('sigma = %g, m0 = %g' % (sa, sqrt(mom[0])))
#!----------------------------------
#! By decreasing Lmax the spectrum estimate becomes smoother.
clf()
Lmax0 = 200; Lmax1 = 50
plt.clf()
Lmax0 = 200
Lmax1 = 50
S1 = ts.tospecdata(L=Lmax0)
S2 = ts.tospecdata(L=Lmax1)
S1.plot('-.')
S2.plot()
show()
plt.show()
#! Estimated autocovariance
#!----------------------------
@ -123,14 +123,14 @@ show()
#! function. The following code will compute the covariance for the
#! unimodal spectral density S1 and compare it with estimated
#! covariance of the signal xx.
clf()
plt.clf()
Lmax = 85
R1 = S1.tocovdata(nr=1)
Rest = ts.tocovdata(lag=Lmax)
R1.plot('.')
Rest.plot()
axis([0, 25, -0.1, 0.25])
show()
plt.axis([0, 25, -0.1, 0.25])
plt.show()
#! We can see in Figure below that the covariance function corresponding to
#! the spectral density S2 significantly differs from the one estimated
@ -138,11 +138,11 @@ show()
#! It can be seen in Figure above that the covariance corresponding to S1
#! agrees much better with the estimated covariance function
clf()
plt.clf()
R2 = S2.tocovdata(nr=1)
R2.plot('.')
Rest.plot()
show()
plt.show()
#! Section 2.2.2 Transformed Gaussian models
#!-------------------------------------------
@ -156,17 +156,17 @@ rho4 = ws.kurtosis(xx[:, 1])
sk, ku = S1.stats_nl(moments='sk')
#! Comparisons of 3 transformations
clf()
plt.clf()
import wafo.transform.models as wtm
gh = wtm.TrHermite(mean=me, sigma=sa, skew=sk, kurt=ku).trdata()
g = wtm.TrLinear(mean=me, sigma=sa).trdata() # Linear transformation
glc, gemp = lc.trdata(mean=me, sigma=sa)
glc.plot('b-') #! Transf. estimated from level-crossings
gh.plot('b-.') #! Hermite Transf. estimated from moments
glc.plot('b-') # Transf. estimated from level-crossings
gh.plot('b-.') # Hermite Transf. estimated from moments
g.plot('r')
grid('on')
show()
plt.grid('on')
plt.show()
#! Test Gaussianity of a stochastic process
#!------------------------------------------
@ -177,41 +177,42 @@ show()
#!
#! As we see from the figure below: none of the simulated values of test1 is
#! above 1.00. Thus the data significantly departs from a Gaussian distribution.
clf()
plt.clf()
test0 = glc.dist2gauss()
#! the following test takes time
N = len(xx)
test1 = S1.testgaussian(ns=N, cases=50, test0=test0)
is_gaussian = sum(test1 > test0) > 5
print(is_gaussian)
show()
plt.show()
#! Normalplot of data xx
#!------------------------
#! indicates that the underlying distribution has a "heavy" upper tail and a
#! "light" lower tail.
clf()
plt.clf()
import pylab
ws.probplot(ts.data.ravel(), dist='norm', plot=pylab)
show()
plt.show()
#! Section 2.2.3 Spectral densities of sea data
#!-----------------------------------------------
#! Example 2: Different forms of spectra
#!
import wafo.spectrum.models as wsm
clf()
Hm0 = 7; Tp = 11;
plt.clf()
Hm0 = 7
Tp = 11
spec = wsm.Jonswap(Hm0=Hm0, Tp=Tp).tospecdata()
spec.plot()
show()
plt.show()
#! Directional spectrum and Encountered directional spectrum
#! Directional spectrum
clf()
plt.clf()
D = wsm.Spreading('cos2s')
Sd = D.tospecdata2d(spec)
Sd.plot()
show()
plt.show()
##!Encountered directional spectrum
@ -298,14 +299,15 @@ show()
#! Estimated spectrum compared to Torsethaugen spectrum
#!-------------------------------------------------------
clf()
fp = 1.1;dw = 0.01
plt.clf()
fp = 1.1
dw = 0.01
H0 = S1.characteristic('Hm0')[0]
St = wsm.Torsethaugen(Hm0=H0,Tp=2*pi/fp).tospecdata(np.arange(0,5+dw/2,dw))
St = wsm.Torsethaugen(Hm0=H0,Tp=2*np.pi/fp).tospecdata(np.arange(0,5+dw/2,dw))
S1.plot()
St.plot('-.')
axis([0, 6, 0, 0.4])
show()
plt.axis([0, 6, 0, 0.4])
plt.show()
#! Transformed Gaussian model compared to Gaussian model
@ -322,4 +324,4 @@ xsim_t[:,1] = gh.gauss2dat(ysim_t[:,1])
ts_y = wo.mat2timeseries(ysim_t)
ts_x = wo.mat2timeseries(xsim_t)
ts_y.plot_wave(sym1='r.', ts=ts_x, sym2='b', sigma=sa, nsub=5, nfig=1)
show()
plt.show()

File diff suppressed because it is too large Load Diff

@ -1,6 +1,3 @@
import numpy as np
from scipy import *
from pylab import *
#! CHAPTER4 contains the commands used in Chapter 4 of the tutorial
#!=================================================================
@ -27,11 +24,13 @@ from pylab import *
#! Chapter 4 Fatigue load analysis and rain-flow cycles
#!------------------------------------------------------
printing=0;
printing = 0
#! Section 4.3.1 Crossing intensity
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import numpy as np
from wafo.plotbackend import plotbackend as plt
import wafo.data as wd
import wafo.objects as wo
@ -42,16 +41,16 @@ mM = tp.cycle_pairs(kind='min2max')
lc = mM.level_crossings(intensity=True)
T_sea = ts.args[-1]-ts.args[0]
subplot(1,2,1)
plt.subplot(1,2,1)
lc.plot()
subplot(1,2,2)
plt.subplot(1,2,2)
lc.setplotter(plotmethod='step')
lc.plot()
show()
plt.show()
m_sea = ts.data.mean()
f0_sea = interp(m_sea, lc.args,lc.data)
f0_sea = np.interp(m_sea, lc.args,lc.data)
extr_sea = len(tp.data)/(2*T_sea)
alfa_sea = f0_sea/extr_sea
print('alfa = %g ' % alfa_sea)
@ -62,37 +61,39 @@ print('alfa = %g ' % alfa_sea )
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mM_rfc = tp.cycle_pairs(h=0.3)
clf()
subplot(122),
plt.clf()
plt.subplot(122),
mM.plot()
title('min-max cycle pairs')
subplot(121),
plt.title('min-max cycle pairs')
plt.subplot(121),
mM_rfc.plot()
title('Rainflow filtered cycles')
show()
plt.title('Rainflow filtered cycles')
plt.show()
#! Min-max and rainflow cycle distributions
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import wafo.misc as wm
ampmM_sea = mM.amplitudes()
ampRFC_sea = mM_rfc.amplitudes()
clf()
subplot(121)
plt.clf()
plt.subplot(121)
wm.plot_histgrm(ampmM_sea,25)
ylim = gca().get_ylim()
title('min-max amplitude distribution')
subplot(122)
ylim = plt.gca().get_ylim()
plt.title('min-max amplitude distribution')
plt.subplot(122)
wm.plot_histgrm(ampRFC_sea,25)
gca().set_ylim(ylim)
title('Rainflow amplitude distribution')
show()
plt.gca().set_ylim(ylim)
plt.title('Rainflow amplitude distribution')
plt.show()
#!#! Section 4.3.3 Simulation of rainflow cycles
#!#! Simulation of cycles in a Markov model
n=41; param_m=[-1, 1, n]; param_D=[1, n, n];
u_markov=levels(param_m);
G_markov=mktestmat(param_m,[-0.2, 0.2],0.15,1);
T_markov=5000;
# n = 41
# param_m = [-1, 1, n]
# param_D = [1, n, n]
# u_markov=levels(param_m);
# G_markov=mktestmat(param_m,[-0.2, 0.2],0.15,1);
# T_markov=5000;
#xxD_markov=mctpsim({G_markov [,]},T_markov);
#xx_markov=[(1:T_markov)' u_markov(xxD_markov)'];
#clf

@ -1,195 +1,238 @@
%% CHAPTER5 contains the commands used in Chapter 5 of the tutorial
%
% CALL: Chapter5
%
% Some of the commands are edited for fast computation.
% Each set of commands is followed by a 'pause' command.
%
% Tested on Matlab 5.3
% History
% Added Return values by GL August 2008
% Revised pab sept2005
% Added sections -> easier to evaluate using cellmode evaluation.
% Created by GL July 13, 2000
% from commands used in Chapter 5
%
%% Chapter 5 Extreme value analysis
%% Section 5.1 Weibull and Gumbel papers
## CHAPTER5 contains the commands used in Chapter 5 of the tutorial
#
# CALL: Chapter5
#
# Some of the commands are edited for fast computation.
# Each set of commands is followed by a 'pause' command.
#
# Tested on Matlab 5.3
# History
# Added Return values by GL August 2008
# Revised pab sept2005
# Added sections -> easier to evaluate using cellmode evaluation.
# Created by GL July 13, 2000
# from commands used in Chapter 5
#
## Chapter 5 Extreme value analysis
## Section 5.1 Weibull and Gumbel papers
from __future__ import division
import numpy as np
import scipy.interpolate as si
from wafo.plotbackend import plotbackend as plt
import wafo.data as wd
import wafo.objects as wo
import wafo.stats as ws
import wafo.kdetools as wk
pstate = 'off'
% Significant wave-height data on Weibull paper,
clf
Hs = load('atlantic.dat');
wei = plotweib(Hs)
wafostamp([],'(ER)')
disp('Block = 1'),pause(pstate)
%%
% Significant wave-height data on Gumbel paper,
clf
gum=plotgumb(Hs)
wafostamp([],'(ER)')
disp('Block = 2'),pause(pstate)
%%
% Significant wave-height data on Normal probability paper,
plotnorm(log(Hs),1,0);
wafostamp([],'(ER)')
disp('Block = 3'),pause(pstate)
%%
% Return values in the Gumbel distribution
clf
T=1:100000;
sT=gum(2) - gum(1)*log(-log(1-1./T));
semilogx(T,sT), hold
N=1:length(Hs); Nmax=max(N);
plot(Nmax./N,sort(Hs,'descend'),'.')
title('Return values in the Gumbel model')
xlabel('Return period')
ylabel('Return value')
wafostamp([],'(ER)')
disp('Block = 4'),pause(pstate)
%% Section 5.2 Generalized Pareto and Extreme Value distributions
%% Section 5.2.1 Generalized Extreme Value distribution
% Empirical distribution of significant wave-height with estimated
% Generalized Extreme Value distribution,
gev=fitgev(Hs,'plotflag',2)
wafostamp([],'(ER)')
disp('Block = 5a'),pause(pstate)
clf
x = linspace(0,14,200);
plotkde(Hs,[x;pdfgev(x,gev)]')
disp('Block = 5b'),pause(pstate)
% Analysis of yura87 wave data.
% Wave data interpolated (spline) and organized in 5-minute intervals
% Normalized to mean 0 and std = 1 to get stationary conditions.
% maximum level over each 5-minute interval analysed by GEV
xn = load('yura87.dat');
XI = 0:0.25:length(xn);
N = length(XI); N = N-mod(N,4*60*5);
YI = interp1(xn(:,1),xn(:,2),XI(1:N),'spline');
YI = reshape(YI,4*60*5,N/(4*60*5)); % Each column holds 5 minutes of
% interpolated data.
Y5 = (YI-ones(1200,1)*mean(YI))./(ones(1200,1)*std(YI));
Y5M = max(Y5);
Y5gev = fitgev(Y5M,'method','mps','plotflag',2)
wafostamp([],'(ER)')
disp('Block = 6'),pause(pstate)
%% Section 5.2.2 Generalized Pareto distribution
% Exceedances of significant wave-height data over level 3,
gpd3 = fitgenpar(Hs(Hs>3)-3,'plotflag',1);
wafostamp([],'(ER)')
%%
figure
% Exceedances of significant wave-height data over level 7,
gpd7 = fitgenpar(Hs(Hs>7),'fixpar',[nan,nan,7],'plotflag',1);
wafostamp([],'(ER)')
disp('Block = 6'),pause(pstate)
%%
%Simulates 100 values from the GEV distribution with parameters (0.3, 1, 2), then estimates the
%parameters using two different methods and plots the estimated distribution functions together
%with the empirical distribution.
Rgev = rndgev(0.3,1,2,1,100);
gp = fitgev(Rgev,'method','pwm');
gm = fitgev(Rgev,'method','ml','start',gp.params,'plotflag',0);
x=sort(Rgev);
plotedf(Rgev,gp,{'-','r-'});
hold on
plot(x,cdfgev(x,gm),'--')
hold off
wafostamp([],'(ER)')
disp('Block =7'),pause(pstate)
%%
% ;
Rgpd = rndgenpar(0.4,1,0,1,100);
plotedf(Rgpd);
hold on
gp = fitgenpar(Rgpd,'method','pkd','plotflag',0);
x=sort(Rgpd);
plot(x,cdfgenpar(x,gp))
% gm = fitgenpar(Rgpd,'method','mom','plotflag',0);
% plot(x,cdfgenpar(x,gm),'g--')
gw = fitgenpar(Rgpd,'method','pwm','plotflag',0);
plot(x,cdfgenpar(x,gw),'g:')
gml = fitgenpar(Rgpd,'method','ml','plotflag',0);
plot(x,cdfgenpar(x,gml),'--')
gmps = fitgenpar(Rgpd,'method','mps','plotflag',0);
plot(x,cdfgenpar(x,gmps),'r-.')
hold off
wafostamp([],'(ER)')
disp('Block = 8'),pause(pstate)
%%
% Return values for the GEV distribution
T = logspace(1,5,10);
[sT, sTlo, sTup] = invgev(1./T,Y5gev,'lowertail',false,'proflog',true);
%T = 2:100000;
%k=Y5gev.params(1); mu=Y5gev.params(3); sigma=Y5gev.params(2);
%sT1 = invgev(1./T,Y5gev,'lowertail',false);
%sT=mu + sigma/k*(1-(-log(1-1./T)).^k);
clf
semilogx(T,sT,T,sTlo,'r',T,sTup,'r'), hold
N=1:length(Y5M); Nmax=max(N);
plot(Nmax./N,sort(Y5M,'descend'),'.')
title('Return values in the GEV model')
xlabel('Return priod')
ylabel('Return value')
grid on
disp('Block = 9'),pause(pstate)
%% Section 5.3 POT-analysis
% Estimated expected exceedance over level u as function of u.
clf
plotreslife(Hs,'umin',2,'umax',10,'Nu',200);
wafostamp([],'(ER)')
disp('Block = 10'),pause(pstate)
%%
% Estimated distribution functions of monthly maxima
%with the POT method (solid),
% fitting a GEV (dashed) and the empirical distribution.
% POT- method
gpd7 = fitgenpar(Hs(Hs>7)-7,'method','pwm','plotflag',0);
khat = gpd7.params(1);
sigmahat = gpd7.params(2);
muhat = length(Hs(Hs>7))/(7*3*2);
bhat = sigmahat/muhat^khat;
ahat = 7-(bhat-sigmahat)/khat;
x = linspace(5,15,200);
plot(x,cdfgev(x,khat,bhat,ahat))
disp('Block = 11'),pause(pstate)
%%
% Since we have data to compute the monthly maxima mm over
%42 months we can also try to fit a
% GEV distribution directly:
mm = zeros(1,41);
for i=1:41
mm(i)=max(Hs(((i-1)*14+1):i*14));
end
gev=fitgev(mm);
hold on
plotedf(mm)
plot(x,cdfgev(x,gev),'--')
hold off
wafostamp([],'(ER)')
disp('Block = 12, Last block'),pause(pstate)
# Significant wave-height data on Weibull paper,
fig = plt.figure()
ax = fig.add_subplot(111)
Hs = wd.atlantic()
wei = ws.weibull_min.fit(Hs)
tmp = ws.probplot(Hs, wei, ws.weibull_min, plot=ax)
plt.show()
#wafostamp([],'(ER)')
#disp('Block = 1'),pause(pstate)
##
# Significant wave-height data on Gumbel paper,
plt.clf()
ax = fig.add_subplot(111)
gum = ws.gumbel_r.fit(Hs)
tmp1 = ws.probplot(Hs, gum, ws.gumbel_r, plot=ax)
#wafostamp([],'(ER)')
plt.show()
#disp('Block = 2'),pause(pstate)
##
# Significant wave-height data on Normal probability paper,
plt.clf()
ax = fig.add_subplot(111)
phat = ws.norm.fit2(np.log(Hs))
phat.plotresq()
#tmp2 = ws.probplot(np.log(Hs), phat, ws.norm, plot=ax)
#wafostamp([],'(ER)')
plt.show()
#disp('Block = 3'),pause(pstate)
##
# Return values in the Gumbel distribution
plt.clf()
T = np.r_[1:100000]
sT = gum[0] - gum[1] * np.log(-np.log1p(-1./T))
plt.semilogx(T, sT)
plt.hold(True)
# ws.edf(Hs).plot()
Nmax = len(Hs)
N = np.r_[1:Nmax+1]
plt.plot(Nmax/N, sorted(Hs, reverse=True), '.')
plt.title('Return values in the Gumbel model')
plt.xlabel('Return period')
plt.ylabel('Return value')
#wafostamp([],'(ER)')
plt.show()
#disp('Block = 4'),pause(pstate)
## Section 5.2 Generalized Pareto and Extreme Value distributions
## Section 5.2.1 Generalized Extreme Value distribution
# Empirical distribution of significant wave-height with estimated
# Generalized Extreme Value distribution,
gev = ws.genextreme.fit2(Hs)
gev.plotfitsummary()
# wafostamp([],'(ER)')
# disp('Block = 5a'),pause(pstate)
plt.clf()
x = np.linspace(0,14,200)
kde = wk.TKDE(Hs, L2=0.5)(x, output='plot')
kde.plot()
plt.hold(True)
plt.plot(x, gev.pdf(x),'--')
# disp('Block = 5b'),pause(pstate)
# Analysis of yura87 wave data.
# Wave data interpolated (spline) and organized in 5-minute intervals
# Normalized to mean 0 and std = 1 to get stationary conditions.
# maximum level over each 5-minute interval analysed by GEV
xn = wd.yura87()
XI = np.r_[1:len(xn):0.25] - .99
N = len(XI)
N = N - np.mod(N, 4*60*5)
YI = si.interp1d(xn[:, 0],xn[:, 1], kind='linear')(XI)
YI = YI.reshape(4*60*5, N/(4*60*5)) # Each column holds 5 minutes of
# interpolated data.
Y5 = (YI - YI.mean(axis=0)) / YI.std(axis=0)
Y5M = Y5.maximum(axis=0)
Y5gev = ws.genextreme.fit2(Y5M,method='mps')
Y5gev.plotfitsummary()
#wafostamp([],'(ER)')
#disp('Block = 6'),pause(pstate)
## Section 5.2.2 Generalized Pareto distribution
# Exceedances of significant wave-height data over level 3,
gpd3 = ws.genpareto.fit2(Hs[Hs>3]-3, floc=0)
gpd3.plotfitsummary()
#wafostamp([],'(ER)')
##
plt.figure()
# Exceedances of significant wave-height data over level 7,
gpd7 = ws.genpareto.fit2(Hs(Hs>7), floc=7)
gpd7.plotfitsummary()
# wafostamp([],'(ER)')
# disp('Block = 6'),pause(pstate)
##
#Simulates 100 values from the GEV distribution with parameters (0.3, 1, 2),
# then estimates the parameters using two different methods and plots the
# estimated distribution functions together with the empirical distribution.
Rgev = ws.genextreme.rvs(0.3,1,2,size=100)
gp = ws.genextreme.fit2(Rgev, method='mps');
gm = ws.genextreme.fit2(Rgev, *gp.par.tolist(), method='ml')
gm.plotfitsummary()
gp.plotecdf()
plt.hold(True)
plt.plot(x, gm.cdf(x), '--')
plt.hold(False)
#wafostamp([],'(ER)')
#disp('Block =7'),pause(pstate)
##
# ;
Rgpd = ws.genpareto.rvs(0.4,0, 1,size=100)
gp = ws.genpareto.fit2(Rgpd, method='mps')
gml = ws.genpareto.fit2(Rgpd, method='ml')
gp.plotecdf()
x = sorted(Rgpd)
plt.hold(True)
plt.plot(x, gml.cdf(x))
# gm = fitgenpar(Rgpd,'method','mom','plotflag',0);
# plot(x,cdfgenpar(x,gm),'g--')
#gw = fitgenpar(Rgpd,'method','pwm','plotflag',0);
#plot(x,cdfgenpar(x,gw),'g:')
#gml = fitgenpar(Rgpd,'method','ml','plotflag',0);
#plot(x,cdfgenpar(x,gml),'--')
#gmps = fitgenpar(Rgpd,'method','mps','plotflag',0);
#plot(x,cdfgenpar(x,gmps),'r-.')
plt.hold(False)
#wafostamp([],'(ER)')
#disp('Block = 8'),pause(pstate)
##
# Return values for the GEV distribution
T = np.logspace(1, 5, 10);
#[sT, sTlo, sTup] = invgev(1./T,Y5gev,'lowertail',false,'proflog',true);
#T = 2:100000;
#k=Y5gev.params(1); mu=Y5gev.params(3); sigma=Y5gev.params(2);
#sT1 = invgev(1./T,Y5gev,'lowertail',false);
#sT=mu + sigma/k*(1-(-log(1-1./T)).^k);
plt.clf()
#plt.semilogx(T,sT,T,sTlo,'r',T,sTup,'r')
#plt.hold(True)
#N = np.r_[1:len(Y5M)]
#Nmax = max(N);
#plot(Nmax./N, sorted(Y5M,reverse=True), '.')
#plt.title('Return values in the GEV model')
#plt.xlabel('Return priod')
#plt.ylabel('Return value')
#plt.grid(True)
#disp('Block = 9'),pause(pstate)
## Section 5.3 POT-analysis
# Estimated expected exceedance over level u as function of u.
plt.clf()
mrl = ws.reslife(Hs,'umin',2,'umax',10,'Nu',200);
mrl.plot()
#wafostamp([],'(ER)')
#disp('Block = 10'),pause(pstate)
##
# Estimated distribution functions of monthly maxima
#with the POT method (solid),
# fitting a GEV (dashed) and the empirical distribution.
# POT- method
gpd7 = ws.genpareto.fit2(Hs(Hs>7)-7, method='mps', floc=0)
khat, loc, sigmahat = gpd7.par
muhat = len(Hs[Hs>7])/(7*3*2)
bhat = sigmahat/muhat**khat
ahat = 7-(bhat-sigmahat)/khat
x = np.linspace(5,15,200);
plt.plot(x,ws.genextreme.cdf(x, khat,bhat,ahat))
# disp('Block = 11'),pause(pstate)
##
# Since we have data to compute the monthly maxima mm over
#42 months we can also try to fit a
# GEV distribution directly:
mm = np.zeros((1,41))
for i in range(41):
mm[i] = max(Hs[((i-1)*14+1):i*14])
gev = ws.genextreme.fit2(mm)
plt.hold(True)
gev.plotecdf()
plt.hold(False)
#wafostamp([],'(ER)')
#disp('Block = 12, Last block'),pause(pstate)

@ -45,7 +45,10 @@ def delete_text_object(gidtxt, figure=None, axis=None, verbose=False):
def _delete_gid_objects(handle, gidtxt, verbose):
objs = handle.findobj(lmatchfun)
name = handle.__name__
try:
name = handle.__class__.__name__
except AttributeError:
name = 'unknown object'
msg = "Tried to delete a non-existing {0} from {1}".format(gidtxt,
name)
for obj in objs:
@ -127,7 +130,10 @@ def cltext(levels, percent=False, n=4, xs=0.036, ys=0.94, zs=0, figure=None,
yss = yint[0] + ys * (yint[1] - yint[0])
# delete cltext object if it exists
try:
delete_text_object(_CLTEXT_GID, axis=axis)
except Exception:
pass
charHeight = 1.0 / 33.0
delta_y = charHeight

@ -3447,8 +3447,10 @@ class SpecData1D(PlotData):
>>> S.bandwidth([0,'eps2',2,3])
array([ 0.73062845, 0.34476034, 0.68277527, 2.90817052])
'''
m, unused_mtxt = self.moment(nr=4, even=False)
m, unused_mtxt = self.moment(nr=4, even=False)
if isinstance(factors, str):
factors = [factors]
fact_dict = dict(alpha=0, eps2=1, eps4=3, qp=3, Qp=3)
fact = array([fact_dict.get(idx, idx)
for idx in list(factors)], dtype=int)

Loading…
Cancel
Save