Lund tekniska högskola Matematikcentrum Matematisk statistik STATISTISKA METODER FÖR SÄKERHETSANALYS FMS065 1 Förberedelseuppgifter Datorövning 5 Tillförlitlighet hos system 1. Läs igenom handledningen och kapitel 8 8.1 i boken. 2 Systemtillförlitlighet Tillförlitligheten hos ett system, t.ex. en konstruktion, ett fordon, en produktionslinje, ett logistiksystem för ett stort lager, ett datornärverk, ett kärnkraftverk, en fördämning, en kommunikationssatellit eller en finansportfölj, är ofta definierad som sannolikheten att systemet fungerar som det är tänkt. Vi använder också det motsatta konceptet, dvs. felsannolikheten P f (f står för failure ), som är sannolikheten att systemet inte fungerar som det var tänkt. Funktionsnivån hos systemet kommer uppenbarligen att bero på egenskaperna hos systemet. Antag att alla intressanta egenskaper hos systemet kan beskrivas med hjälp av en uppsättning parametrar x 1, x 2,..., x n. Vi vill att systemet ska tåla en uppsättning belastningar, som vi väljer, dvs. konstruktionen måste tåla en viss nivå på vindstyrka eller vikt, ett fordon måste kunna färdas en godtagbar sträcka innan dess motor går sönder, en produktionslinje måste producera gods oavbrutet under minst en vecka för att vara lönsam, lagrets logistiksystem måste kunna leverera minst 99 % av de beställda varorna i tid och till rätt beställare. Storleken på dessa belastningar, y 1, y 2,..., y m, måste begränsas, på grund av konstruktionsbrister, kostnadsbegränsningar, tidsbegränsningar, etc. Det finns alltså kombinationer av laster, y 1, y 2,..., y m och systemegenskaper, x 1, x 2,..., x n, för vilka systemets kapacitet överskrids och där systemet går sönder. Vi kan uttrycka detta som Systemet fungerar som tänkt h(y 1,..., y m, x 1,..., x n ) > 0 Systemet fungerar inte som tänkt h(y 1,..., y m, x 1,..., x n ) < 0 Funktionen h kallas felfunktion ( failure funktion, performance function, state function ). Om parametrarna och lasterna är slumpmässiga betraktar vi dem som slumpvariabler, Y 1, Y 2,..., Y m och X 1, X 2,..., X n. Nu kan vi skriva felsannolikheten P f som P f = P(h(Y 1,...,Y m, X 1,..., X n ) < 0) Slumpvariabeln Z = h(y 1,...,Y m, X 1,...,X n ) kallas ibland för säkerhetsmarginalen. I denna datorövning ska vi beräkna P f. Både funktionen h och fördelningarna för Y 1,...,Y m och X 1,..., X n kommer att vara kända. Däremot kommer felsannolikheten inte alltid att vara så enkel att beräkna utan vi kommer att behöva simulera fram den. 3 En last och en styrka Vi har en konstruktion av något slag. Den last S ( stress ) konstruktionen utsätts för har fördelningsfunktionen F S (x) = exp( e (x b S)/a S )
ii där b S = 55 och a S = 2.5. Styrkan R ( resistance ) hos kunstruktionen har fördelningsfunktionen { F R (x) = 1 e x br cr a R, x > b R 0, x b R där b R = 70, a R = 5 och and c R = 2. Uppgift: Identifiera fördelningarna (normal, Weibull, Gumbel, likformig,... )? Antag att lasten och stykan är oberoende. Då blir felfunktionen h helt enkelt h(r, S) = R S och felsannolikheten blir P f = P(h(R, S) < 0) = P(R S < 0) = P(S > R) Vi börjar med att rita upp de två täthetsfunktionerna f S (x) och f R (x): >> as=2.5; bs=55; ar=5; br=70; cr=2; >> x=linspace(45,90); >> fsx=gumbpdf(x,as,bs); % gumbpdf från kurshemsidan. >> frx=wblpdf(x-br,ar,cr); % Matlabs Weibullfördelning saknar b-parameter! >> figure(1) >> plot(x,frx, b-,x,fsx, r- ) >> legend( f_r(x) styrka, f_s(x) last ) >> xlabel( x ) Uppgift: Ser det ut som om felsannolikheten är stor eller liten? Felsannolikheten kan beräknas som (satsen om total sannolikhet): P f = P(S > R) = = b R ( 1 exp( e (r b S)/a S ) P(S > r R = r) f R (r) dr = ) cr a R ( r br a R (1 F S (r)) f R (r) dr = ) cr 1 e r br cr a R dr Denna fruktansvärda integral kan inte beräknas analytiskt. Men det finns i Matlab en enkel rutin för numerisk integration, trapz, som använder trapetsmetoden. För att använda den måste vi först definiera integranden på en grid: >> r=br:0.01:150; % Vi ska integrera till oändligheten men 150 räcker. >> FSr=gumbcdf(r,aS,bS); % gumbcdf från hemsidan. >> frr=wblpdf(r-br,ar,cr); >> integrand=(1-fsr).*frr; >> Pf = trapz(r,integrand); Uppgift: Beräkna felsannolikheten. Hur ofta kan man förvänta sig att systemet går sönder?
iii 3.1 Simulering av P f Här lyckades vi skriva upp och beräkna den integral som gav felsannolikheten. Om systemet är mer komplicerat kan det vara omöjligt. Då kan man, om man känner fördelningarna, beräkna felsannolikheten med hjälp av simulering istället. Om felsannolikheten är liten kan det vara svårt eftersom vi då måste simulera ett mycket stort antal gånger för att få med flera fel. Vi kan förvänta oss att systemet går sönder, i medeltal, en gång på 1/P f. Vi måste alltså simulera flera tusentals gånger för att vår simulering ska ge tillförlitligt resultat. Eftersom vi i praktiken simulerar bara när vi inte kan beräkna P f kan vi inte på förhand veta hur stor simulering som behövs. Vi gör en lite för liten simulering för att se hur det går: >> N=500; % Simulera S och R 500 gånger. >> S=gumbrnd(aS,bS,1,N); % gumbrnd från hemsidan. >> R=bR+wblrnd(aR,cR,1,N); >> figure(2) >> plot(1:n,r, bo,1:n,s, r* ) % Rita de simulerade S och R. >> legend( R: styrka, S: last ) >> xlabel( Simuleringsnummer ) Uppgift: Jämför figuren med täthetsfunktionerna i förra figuren. Ser det ut som om konstruktionen går sönder i någon av simuleringarna? Även om det hamnade en eller två laster uppe bland styrkorna är det ju inte säkert att lasten översteg sin styrka. Vi kan se det om vi ritar lasterna och styrkorna mot varandra: >> figure(3) >> I=find(S>R); % find ger indexen för de simuleringar där S>R. >> plot(r,s, b. ) >> plot(r(i),s(i), ro ) % Rödmarkera de S-R-par där S>R. >> plot([65 90],[65 90], k-,[65 90],[bR br], k-,[br br],[45 90], k- ) % Diverse avgränsnande linjer, se nedan. >> xlabel( R ) >> ylabel( S ) Den vertikala linjen anger den undre gränsen för styrkan, dvs. b R. Det finns aldrig punkter till vänster om den. Över den horisontella linjen (också b R ) ligger de laster som överstiger den undre gränsen för styrkan. Det är de röda punkter som låg bland de blå i figur 2. Diagonalen anger när lasten är lika med styrkan. De punkter som ligger ovanför den är de där lasten översteg styrkan (nummerna ii). Uppgift: Låg någon av lasterna över motsvarande styrka? Nu skattar vi felsannolikheten: >> h=r-s; >> Pf_hat=sum(h<0)/N Uppgift: Blev skattningen bra?
iv Uppgift: Gör om hela simuleringen (och figurerna). Hur gick det med skattningen? Osäkerheten hos simuleringen Skattningen blir uppenbarligen mycket osäker och ofta lika med noll. Vi kan ta reda på hur osäker den blir genom att göra 500 simuleringar och upprepa det ett stort antal gånger, ungefär som när vi gjorde bootstrap, men med skillnaden att vi nu kan simulera från de sanna fördelningarna. Sedan kan vi göra ett histogram över skattningarna för att bedöma osäkerheten: >> M = 1000; % M=1000 upprepningar med N=500 i varje. >> for k=1:m Sboot=gumbrnd(aS,bS,1,N); Rboot=bR+wblrnd(aR,cR,1,N); hboot=sboot-rboot; Pfboot(k)=sum(hboot>0)/N; end >> figure(4) >> hist(pfboot) >> plot([pf Pf],[0 800], r- ) % Det sanna Pf-värdet enligt integralen. >> axis([0 8*10^(-3) 0 Inf]) % Sätt skalan så vi kan jämföra med nästa metod. Uppgift: Varför ser skattningens fördelning ut som den gör? Eftersom antalet fel bland 500 simueringar är Bin(500, P f )-fördelat kan vi beräkna skattningens väntevärde, P f, standardavvikelse, P f (1 P f )/500, och variationskoefficient: >> E_Pfboot = Pf >> D_Pfboot = sqrt(pf*(1-pf)/n) >> R_Pfboot = D_Pfboot/E_Pfboot Uppgift: Notera variationskoefficienten. 3.2 Importance sampling Det räcker uppenbarligen inte att bara simulera 500 gånger för att få en bra uppskattning av felsannolikheten. Vi kan naturligtvis öka antalet simuleringar från 500 till något (mycket) större men om den sannolikhet vi ska uppskatta är mycket liten kan det vara nästan omöjligt att simulera så mycket som behövs. Problemet är ju att vi får en massa nollor (när lasten understiger styrkan) och bara några enstaka ettor (när lasten överstiger styrkan). Vi skulle vilja hitta på ett sätt att få fler fel. En sådan metod är importance sampling som går ut på att simulera från en annan fördelning som ger fler fel och sedan vikta resultatet på lämpligt sätt. Vårt problem är ju (se figur 1) att övre svansen i fördelningen för lasten S knappt kommer upp ens till undre gränsen för styrkan R. Om lastfördelningen legat högre upp skulle vi fått fler fel och kunnat göra en bättre skattning. Det hade, t.ex., varit praktiskt om lasten legat 15 enheter högre upp:
v >> % Rita först om figur 1 om du slängt den! >> figure(1) >> S_flytt=15; >> plot(x,gumbpdf(x,as,bs+s_flytt), r-- ) % Lägesparametern ökad 15 enheter. Om vi simulerar lasterna från denna nya fördelning kommer vi att få fler fall där S > R. Problemet är bara att det blir alldeles för många fel. Eftersom en täthetsfunktion f (x) är proportionell mot sannolikheten att hamna i närheten av x kan vi räkna ut hur stor andel av de värden som simulerades till värdet x som skulle blivit så stora om vi simulerat från den rätta fördelningen i stället för den flyttade, nämligen f S (x) f Sflyttad (x) (1) Det utnyttjar vi genom att vikta de framsimulerade felen med denna andel. Då blir det inte bara en massa nollor utan ett antal tal mellan 0 och 1 som anger hur stor andel av de simulerade felen som fortfarande skulle varit fel om vi simulerat från rätt fördelning. Obervera att fördelningarna f S (x) och f Sflyttad (x) måste vara definierade på samma område annars kan en av dem bli noll och kvoten oanvändbar. Därför importance samplar vi lasterna och inte styrkorna. Gumbelfördelningen är ju definierad på hela reella axeln medan Weibullfördelningen bara är definierad från b R och uppåt. Vi kan alltså inte flytta styrkefördelningen, bara ändra skala, a R, och form, c R. Vi gör en en simuleringsomgång för att se vad som händer: >> R = br+wblrnd(ar,cr,1,n); % Styrkan simuleras som vanligt. >> S = gumbrnd(as,bs+s_flytt,1,n); % Lasten från den flyttade fördelningen. >> I = find(s>r); % Hitta felen. >> kvoter = zeros(size(r)); % Sätt allt till noll först. >> kvoter(i) = gumbpdf(s(i),as,bs)./gumbpdf(s(i),as,bs+s_flytt); % Felen viktas enligt (1). >> Pf_is=sum(kvoter)/N % Pf-skattnigen. Uppgift: Verkar skattningen bättre nu? Vi gör en ny variant av figur 3 med de nya simuleringarna: >> figure(3) >> I=find(S>R); >> plot(r,s, b. ) >> plot(r(i),s(i), ro ) >> plot([65 90],[65 90], k-,[65 90],[bR br], k-,[br br],[45 90], k- ) >> xlabel( R ) >> ylabel( S ) Uppgift: Blev det fler fel nu jämfört med den tidigare simuleringen? Vi har uppenbarligen en hel mängd fel nu. Trots det blir skattningen av felsannolikheten bra eftersom felen viktas ner. Vi ritar upp vikterna (kvoter) också:
vi figure(5) plot(1;n,kvoter, * ) xlabel( Simuleringsnummer ) axis([0 N 0 0.01]) Uppgift: Ungefär hur stor andel av de simulerade felen med den flyttade fördelningen hade gett ett fel med den riktiga fördelningen istället? Osäkerhet hos importance sampling-skattningen Vi avslutar med att uppskatta fördelningen för importance sampling-skattningen av P f genom att upprepa den 1000 gånger och rita ett histogram (jämför figur 4): >> M=1000; >> for k=1:m Rb=bR+wblrnd(aR,cR,1,N); Sb=gumbrnd(aS,bS+S_flytt,1,N); Ib=find(Sb>Rb); kvoterb=zeros(size(rb)); kvoterb(ib) = gumbpdf(sb(ib),as,bs)./gumbpdf(sb(ib),as,bs+s_flytt); Pf_isb(k)=sum(kvoterb)/N; end >> figure(6) >> hist(pf_isb) >> plot([pf Pf],[0 300], r- ) Uppgift: Hur ser fördelningen ut nu? För att jämföra osäkerheten i importance sampling-skattningen med den enkla simuleringsskattningen sätter vi skalan på x-axeln till samma som i figur 4: >> axis([0 8*10^(-3) 0 Inf]) Uppgift: Hur har det gått med osäkerheten hos skattningen? Eftersom vi inte vet vilken fördelning dessa skattningar har uppskattar vi väntevärde, standardavvikelse och variationskoefficient ur de 1000 simuleringsomgångarna: >> E_Pf_is = mean(pf_isb) >> D_Pf_is = std(pf_isb) >> R_Pf_is = D_Pf_is/E_Pf_is Uppgift: Jämför variationskoefficienten med den tidigare. Vad hände med den?
vii Eftersom vi vet att variationskoefficienten för den vanliga simuleringen blev R(Pf ) = D(P f ) E(Pf ) = Pf (1 P f )/N 1 Pf = N = 1 P f P f NP f P f R(Pf )2 kan vi också beräkna hur stort antal simuleringar som hade behövts för att den enkla simuleringen skulle haft lika liten variationskoefficient som en importance sampling med 500 observationer: >> N_krav = (1-Pf)/(Pf*R_Pf_is^2) Uppgift: Hur många simuleringar måste vi göra? Uppgift: Om du har tid över! Gör om den enkla simuleringen i 2.1 men med det nya antalet observationer. Gör också om de 1000 upprepningarna (det kan ta lite tid!) och histogrammet i figur 4 och jämför med importance sampling-resultatet i figur 6.