solpartiel.mw

Une marche aléatoire biaisée 

I. Dérive fixée 

1. La probabilité, ramenée à celles des voisins 

La probabilité est la somme des voisines multipliées par la probabilité du mouvement correspondant. Ceci donne une procédure récursive. Pour gagner en efficacité, il est essentiel d'utiliser l'option remember, et il est utile de mettre 0 dès que la distance à l'origine est supérieure à n. 

> proba:=proc(i,j,n,c)
option remember;
 if abs(i)+abs(j)>n then 0
 elif n=0 then 1.
 else
     proba(i-1,j,n-1,c)*(1/4+c)+proba(i+1,j,n-1,c)*(1/4-c)
     +proba(i,j+1,n-1,c)*1/4+proba(i,j-1,n-1,c)*1/4
 fi
end:
 

Aussi, on note l'initialisation avec 1. pour n=0 et non 1, ce qui force les calculs à être tous en flottants. 

2. Premières estimations numériques 

> Digits:=50:
 

> N:=100:
 

> for i to N do e[i]:=add(proba(0,0,j,1/10),j=1..2*i) od;
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.23000000000000000000000000000000000000000000000000
.34872500000000000000000000000000000000000000000000
.42442375000000000000000000000000000000000000000000
.47764017265625000000000000000000000000000000000000
.51722074647968750000000000000000000000000000000000
.54776019090105078125000000000000000000000000000000
.57193986836708527343750000000000000000000000000000
.59145418449524806460571289062500000000000000000000
.60743752111175973387420654296875000000000000000000
.62068327300801178654164749145507812500000000000000
.63176563395274608769572421722412109375000000000000
.64111168795885349411823231189823150634765625000000
.64904628157045497804704947735667228698730468750000
.65582112787798340565220609443246185779571533203125
.66163434301818816194953471178689916014671325683594
.66664394734516968562856490699920706252553500235081
.67097743117957691901821828459299711292242584750057
.67473868004730893304166003516973248467682393384167
.67801308361062349345347516966974102555826918588719
.68087136762489318782940256447900376605821757075631
.68337251057255304257707923498938709462227034095754
.68556599280285147943672913926445161126242355992958
.68749355133615962355734774261631600054189952380877
.68919056345083156158821480856417196526437484211580
.69068714798389460299048969811773478434163610894902
.69200904951038051599171344435812887965857903990975
.69317835377926886448600217703706728986630329851620
.69421407075363007097878528784479063092100304018450
.69513261286525636442331584330556118062795308743321
.69594818967009797400722740639211470926516268102905
.69667313531386873105005392756664517870348209955048
.69731818162750604399871863218560707279717109271297
.69789268694827056407018674685208305046163602558544
.69840482867651570925966089082634794755481846764145
.69886176596748805504440677902104022746179841945428
.69926977770386259029648597008357116928294499755374
.69963437991170081729074087653660773862350129816956
.69996042600636012888465724204574147741973149409455
.70025219263805240839610970839678282594641035420146
.70051345341353523573495589369285686263541763473304
.70074754237377103072633099498046095433626461232391
.70095740878666637180949680086236109769101344010430
.70114566455334189784058664260839351763313030024129
.70131462531350877727386110972957988038136874614734
.70146634616088372962877416206416513452190135037736
.70160265273567442853289798574296254343160050951029
.70172516834211234610659402334584089726567960200305
.70183533764012805664204210340716636294623637258182
.70193444737783381613153418296722816673761083112887
.70202364456252218263820976990384678937035398753821
.70210395241001332381210569063314101766300181321213
.70217628436345370236738699271951983061327615092283
.70224145643151642691165053419778973025979240487657
.70230019806110105297456048676874569468255760486802
.70235316173003325479133593318866866074032618034726
.70240093142006501618104853023002959837363801318798
.70244403010896738996672107843042469206457044963550
.70248292640210651314355394032374537639292234727436
.70251804040811514933224927816656320132628675427985
.70254974894971363764360204445537893987838520349116
.70257839018905950976220087168357224515331309255030
.70260426773693276853283293095850898311149726925024
.70262765430635769838756449564277467049113535907077
.70264879496372331956456853128385964222345654147861
.70266791002392548382756889323511855901751614357400
.70268519763037227440564103330700974459573819889861
.70270083605575053529670529207194100281505384274970
.70271498575514279832442737091448085557154033914059
.70272779119932354399181038227903705232024593975847
.70273938251277732200673933794703631134705893981020
.70274987693810522313561665885563973865190813163720
.70275938014596608157156743665204284318820732265498
.70276798740748784486105628357066554086794881144597
.70277578464414256516660137434373840028867129031609
.70278284936837079414317944352997206958306488892044
.70278925152673790069182525796376723042414781959703
.70279505425608012525680233957375199835212319899398
.70280031456192965303740747673855383110726314640067
.70280508392747622171980385537369315087216001185353
.70280940886041092108744878610613411393843120519185
.70281333138419123324814476407137053129229844351478
.70281688947955223771679886706089160304091941744098
.70282011748145613394751015492033180592145860741522
.70282304643611109656992471403492830491781899822295
.70282570442219248005092016945218159868442139476334
.70282811683995709462618534013759489368265319954850
.70283030667154816956162044148110334852539059790584
.70283229471543898885319644017316653599906091847965
.70283409979765201074768960840821171695195834336078
.70283573896211315553891044641312094567815828794535
.70283722764225398538526340829321662182858712491861
.70283857981575428773250708210768801825169138243464
.70283980814412109752371254835110170297213788859622
.70284092409862479447725618238538418002553701425221
.70284193807395624281835891533724042551096618236205
.70284285949082892715123396259525172583667649907241
.70284369688862484436161032332478948353999422410945
.70284445800907091282815571648273749919166933350501
.70284514987183241739843652398670596841757265597816
.70284577884282024538676964075797420002101389309060
 

Une estimation de la probabilité de repassage à l'origine pour c=1/10 est donc : 

> e[100]/(1+e[100]);
 

.41274775882549011318077851728818094681545863656980
 

3. Accélération de convergence 

On applique la méthode de Wynn: 

> for i to N+1 do epsilon[-1,i]:=0 od:
 

> for i to N do epsilon[0,i]:=e[i] od:
 

> for i to N-1 do for j to N-i do epsilon[i,j]:=epsilon[i-2,j+1]+1/(epsilon[i-1,j+1]-epsilon[i-1,j]) od; if type(i,even) then print(i,epsilon[i,N-i]/(1+epsilon[i,N-i])) fi od;
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2, .41274992810315900418639590887729360715299456355776
4, .41274995001797738116285233892468656151934390287656
6, .41274995067718122710611055460021229396869964029675
8, .41274995071236597352303072850096643274387782261247
10, .41274995071509926601533968180616288334921241254683
12, .41274995071537822650837118608668638818901528161796
14, .41274995071541340012192465016204474432666641002430
16, .41274995071541866170697366737765542475194374218785
18, .41274995071541956931129735185382607162530841242209
20, .41274995071541974611216025359293615353726205285964
22, .41274995071541978439223035143596969649830600233921
24, .41274995071541979349039189458325241749588786569826
26, .41274995071541979584054408615962305648050860929423
28, .41274995071541979649497689954864048925444950971305
30, .41274995071541979669008939072993895403547644213135
32, .41274995071541979675107320727565857747811842990261
34, .41274995071541979675695890722474750274013952546420
36, .41274995071541979677022535597290349237862792103560
38, .41274995071541979666033941395352263491911862594554
40, .41274995071541979677467268230466863513888317784401
42, .41274995071541979677528965252682739661658736729231
44, .41274995071541979678078832569041095269001162309866
46, .41274995071541979677726312636918721777091323500784
48, .41274995071541979678156081300127172485975855598804
50, .41274995071541979678196993109508888085774450508857
52, .41274995071541979678351036652730079356443405798566
54, .41274995071541979678037368079826464222596760153680
56, .41274995071541979678037466773570955488902753566728
58, .41274995071541979678282495685174189877391352049078
60, .41274995071541979678499284669439531869828239414315
62, .41274995071541979678228558187558251007406438473084
64, .41274995071541979678356757534794817463083637246535
66, .41274995071541979678370647166876517275346232273792
68, .41274995071541979678382292355083927552418190826391
70, .41274995071541979678414433637746504615069911173849
72, .41274995071541979678476892398927567604835476459453
74, .41274995071541979678411031112149860028382090959770
76, .41274995071541979678416328063125417570104522656567
78, .41274995071541979678418507757916383958325063178450
80, .41274995071541979678354512112323662391276436423716
82, .41274995071541979678411796501446435520414554819471
84, .41274995071541979678423474108548499972755430954120
86, .41274995071541979678434131906086053591861285711714
88, .41274995071541979678440786057983334387045223505664
90, .41274995071541979678442528531911231128169013287975
92, .41274995071541979678442528534669661695050587400805
94, .41274995071541979678443322732558717833375476070241
96, .41274995071541979678444941443865139683076365982465
98, .41274995071541979678446489712869325432505616462200
 

> evalf(0.41274995071541979678446489712869325432505616462200,20);
 

.41274995071541979678
 

Ces décimales semblent acquises. 

4. Valeurs exactes et récurrence 

La même procédure, mais en initialisant à 1 et non 1. pour calculer avec des rationnels. 

> proba:=proc(i,j,n,c)
option remember;
 if abs(i)+abs(j)>n then 0
 elif n=0 then 1
 else
     expand(proba(i-1,j,n-1,c)*(1/4+c)+proba(i+1,j,n-1,c)*(1/4-c)
     +proba(i,j+1,n-1,c)*1/4+proba(i,j-1,n-1,c)*1/4)
 fi
end:
 

Il vaut mieux utiliser une version récente de gfun 

> libname:="/Users/salvy/lib/maple/gfun/lib",libname:gfun:-version();
 

3.48
 

> seq(add(proba(0,0,2*j,1/10),j=1..i),i=0..20);
 

0, `/`(23, 100), `/`(13949, 40000), `/`(339539, 800000), `/`(611379421, 1280000000), `/`(331021277747, 640000000000), `/`(140226608870669, 256000000000000), `/`(14641660630197383, 25600000000000000), ...
0, `/`(23, 100), `/`(13949, 40000), `/`(339539, 800000), `/`(611379421, 1280000000), `/`(331021277747, 640000000000), `/`(140226608870669, 256000000000000), `/`(14641660630197383, 25600000000000000), ...
0, `/`(23, 100), `/`(13949, 40000), `/`(339539, 800000), `/`(611379421, 1280000000), `/`(331021277747, 640000000000), `/`(140226608870669, 256000000000000), `/`(14641660630197383, 25600000000000000), ...
 

> gfun:-listtorec([%],u(k));
 

[{`+`(`*`(`+`(`-`(`/`(3, 500)), `-`(`*`(`/`(4, 625), `*`(k))), `-`(`*`(`/`(1, 625), `*`(`^`(k, 2))))), `*`(u(k))), `*`(`+`(`*`(`/`(576, 625), `*`(`^`(k, 2))), `*`(`/`(2879, 625), `*`(k)), `/`(1439, 25...
 

> rec1:=%[1]:
 

5. Cinquante décimales de la probabilité 

> ee:=gfun:-rectoproc(rec1,u(k)):
 

> for i in 1000,2000,3000 do tmp:=ee(i); print(i,evalf(tmp/(1+tmp))) od:
 

 

 

1000, .41274995071541979678492338226105243449189606511320
2000, .41274995071541979678492338226105243449200842514948
3000, .41274995071541979678492338226105243449200842514948
 

Ces 50 décimales semblent acquises. 

II. Ajustement de la dérive 

6. Une récurrence pour les polynômes 

La procédure de la question 4 fonctionne aussi avec c symbolique : 

> proba(0,0,4,c);
 

`+`(`/`(9, 64), `-`(`*`(`/`(9, 4), `*`(`^`(c, 2)))), `*`(6, `*`(`^`(c, 4))))
 

> L:=[seq(add(proba(0,0,j,c),j=1..2*i),i=0..20)]:
 

> gfun:-listtorec(L,u(k));
 

[{`+`(`*`(`+`(`-`(`*`(60, `*`(`^`(c, 4)))), `-`(`*`(64, `*`(k, `*`(`^`(c, 4))))), `-`(`*`(16, `*`(`^`(k, 2), `*`(`^`(c, 4)))))), `*`(u(k))), `*`(`+`(`/`(25, 4), `-`(`*`(50, `*`(`^`(c, 2)))), `*`(60, `...
 

> rec:=%[1];
 

{`+`(`*`(`+`(`-`(`*`(60, `*`(`^`(c, 4)))), `-`(`*`(64, `*`(k, `*`(`^`(c, 4))))), `-`(`*`(16, `*`(`^`(k, 2), `*`(`^`(c, 4)))))), `*`(u(k))), `*`(`+`(`/`(25, 4), `-`(`*`(50, `*`(`^`(c, 2)))), `*`(60, `*...
 

Vérification : 

> evalb(eval(rec,c=1/10)=rec1);
 

true
 

7. La dérive pour des nombres de pas fixés 

> vals:=gfun:-rectoproc(rec,u(k),params=[c],evalfun=expand);
 

proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, expand(0)); `assign`(loc1, expand(`+`(`/`(1, 4), `-`(`*`(2, `*`(`^`(b1, 2))))))); `assign`(loc2, expand(`+`(`/`(25, 64), ...
 

On sait que c est compris entre -1/4 et 1/4. Par symétrie, on peut se contenter de la racine positive : 

> for i in 5,6,7 do 2^i,fsolve(vals(2^i,c)-1,c,0..1/4) od;
 

 

 

32, 0.51003993569655158529902957787339218717926409857805e-1
64, 0.60199554181527606328996006993292477112835458091591e-1
128, 0.61797689812121961823024619787279257422574768663377e-1
 

8. Les dérivées 

> gfun:-listtorec(map(diff,L,c),u(k));
 

[{`+`(`*`(`+`(`-`(`*`(150, `*`(`^`(c, 4)))), `-`(`*`(220, `*`(k, `*`(`^`(c, 4))))), `-`(`*`(16, `*`(`^`(k, 3), `*`(`^`(c, 4))))), `-`(`*`(104, `*`(`^`(k, 2), `*`(`^`(c, 4)))))), `*`(u(k))), `*`(`+`(`/...
[{`+`(`*`(`+`(`-`(`*`(150, `*`(`^`(c, 4)))), `-`(`*`(220, `*`(k, `*`(`^`(c, 4))))), `-`(`*`(16, `*`(`^`(k, 3), `*`(`^`(c, 4))))), `-`(`*`(104, `*`(`^`(k, 2), `*`(`^`(c, 4)))))), `*`(u(k))), `*`(`+`(`/...
 

> valdiff:=gfun:-rectoproc(op(1,%),u(k),params=[c]);
 

proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
proc (`::`(n, nonnegint), b1) local i1, loc0, loc1, loc2, loc3; `assign`(loc0, 0); `assign`(loc1, `+`(`-`(`*`(4, `*`(b1))))); `assign`(loc2, `+`(`-`(`*`(`/`(17, 2), `*`(b1))), `*`(24, `*`(`^`(b1, 3)))...
 

Vérification : 

> seq(expand(valdiff(i,c)-diff(L[i+1],c)),i=1..5);
 

0, 0, 0, 0, 0
 

9. Une résolution par itération de Newton 

L'idée est de ne pas utiliser les polynômes développés, qui sont très gros, mais d'exploiter les procédures pour calculer leurs valeurs à des c fixés. 

Le test d'arrêt que l'on se donne sur la méthode de Newton porte sur la distance entre deux itérations consécutives. 

> newtn:=proc(n) local v, w; w:=.1; v:=0; Digits:=Digits+5;
   while abs(w-v)>Float(1,5-Digits) do v:=w; w:=v-(vals(n,v)-1)/valdiff(n,v) od; evalf(w,Digits-5) end;
 

proc (n) local v, w; `assign`(w, .1); `assign`(v, 0); `assign`(Digits, `+`(Digits, 5)); while `<`(Float(1, `+`(5, `-`(Digits))), abs(`+`(w, `-`(v)))) do `assign`(v, w); `assign`(w, `+`(v, `-`(`/`(`*`(...
 

Vérification : 

> newtn(20);
 

0.25767799173165962939016760923762929532690961432677e-1
 

> fsolve(L[21]-1,c,0..1/4);
 

0.25767799173165962939016760923762929532690961432677e-1
 

10. Les valeurs et leur limite empirique 

> for i in 1000,2000,4000 do i,newtn(i) od;
 

 

 

1000, 0.61913954473990920648324508520191179395473208518498e-1
2000, 0.61913954473990942848175216472951343184056316305618e-1
4000, 0.61913954473990942848175216473212176999638774998362e-1
 

> evalf(%[2],30);
 

0.619139544739909428481752164732e-1
 

III. Preuves et fonctions spéciales 

11. Une récurrence satisfaite par les q[n] 

> U:=binomial(2*n,2*k)*binomial(2*k,k)*pE^k*pO^k*binomial(2*n-2*k,n-k)*pN^(n-k)*pS^(n-k);
 

`*`(binomial(`+`(`*`(2, `*`(n))), `+`(`*`(2, `*`(k)))), `*`(binomial(`+`(`*`(2, `*`(k))), k), `*`(`^`(pE, k), `*`(`^`(pO, k), `*`(binomial(`+`(`*`(2, `*`(n)), `-`(`*`(2, `*`(k)))), `+`(n, `-`(k))), `*...
 

> U:=subs(pE=pEO^2/pO,pN=pNS^2/pS,U);
 

`*`(binomial(`+`(`*`(2, `*`(n))), `+`(`*`(2, `*`(k)))), `*`(binomial(`+`(`*`(2, `*`(k))), k), `*`(`^`(`/`(`*`(`^`(pEO, 2)), `*`(pO)), k), `*`(`^`(pO, k), `*`(binomial(`+`(`*`(2, `*`(n)), `-`(`*`(2, `*...
 

> SumTools[Hypergeometric][Zeilberger](U,n,k,Sn);
 

[`+`(`*`(`^`(Sn, 2), `*`(`+`(`*`(`^`(n, 2)), `*`(4, `*`(n)), 4))), `*`(`+`(`-`(`*`(8, `*`(`^`(pEO, 2), `*`(`^`(n, 2))))), `-`(`*`(8, `*`(`^`(pNS, 2), `*`(`^`(n, 2))))), `-`(`*`(24, `*`(`^`(pNS, 2), `*...
[`+`(`*`(`^`(Sn, 2), `*`(`+`(`*`(`^`(n, 2)), `*`(4, `*`(n)), 4))), `*`(`+`(`-`(`*`(8, `*`(`^`(pEO, 2), `*`(`^`(n, 2))))), `-`(`*`(8, `*`(`^`(pNS, 2), `*`(`^`(n, 2))))), `-`(`*`(24, `*`(`^`(pNS, 2), `*...
[`+`(`*`(`^`(Sn, 2), `*`(`+`(`*`(`^`(n, 2)), `*`(4, `*`(n)), 4))), `*`(`+`(`-`(`*`(8, `*`(`^`(pEO, 2), `*`(`^`(n, 2))))), `-`(`*`(8, `*`(`^`(pNS, 2), `*`(`^`(n, 2))))), `-`(`*`(24, `*`(`^`(pNS, 2), `*...
 

La suite sommée étant nulle pour k<0 et k>n, le membre droit s'annule et la récurrence est donnée par le premier élément de cette réponse. 

> opq:=%[1];
 

`+`(`*`(`^`(Sn, 2), `*`(`+`(`*`(`^`(n, 2)), `*`(4, `*`(n)), 4))), `*`(`+`(`-`(`*`(8, `*`(`^`(pEO, 2), `*`(`^`(n, 2))))), `-`(`*`(8, `*`(`^`(pNS, 2), `*`(`^`(n, 2))))), `-`(`*`(24, `*`(`^`(pNS, 2), `*`...
 

> recq:=add(coeff(opq,Sn,i)*q(n+i),i=0..degree(opq,Sn));
 

`+`(`*`(`+`(`*`(16, `*`(`^`(pEO, 4), `*`(`^`(n, 2)))), `-`(`*`(32, `*`(`^`(pEO, 2), `*`(`^`(pNS, 2), `*`(`^`(n, 2)))))), `-`(`*`(64, `*`(`^`(pEO, 2), `*`(`^`(pNS, 2), `*`(n))))), `*`(32, `*`(`^`(pNS, ...
 

12. Preuve de la récurrence de la question 6. 

> collect(subs(n=k+1,pNS=1/4,pEO=(1/16-c^2)^(1/2),eval(recq,q=proc(n) u(n)-u(n-1) end)),u,expand);
 

`+`(`*`(`+`(`-`(`*`(60, `*`(`^`(c, 4)))), `-`(`*`(64, `*`(k, `*`(`^`(c, 4))))), `-`(`*`(16, `*`(`^`(k, 2), `*`(`^`(c, 4)))))), `*`(u(k))), `*`(`+`(`/`(25, 4), `-`(`*`(50, `*`(`^`(c, 2)))), `*`(60, `*`...
 

> op(remove(type,rec,`=`));
 

`+`(`*`(`+`(`-`(`*`(60, `*`(`^`(c, 4)))), `-`(`*`(64, `*`(k, `*`(`^`(c, 4))))), `-`(`*`(16, `*`(`^`(k, 2), `*`(`^`(c, 4)))))), `*`(u(k))), `*`(`+`(`/`(25, 4), `-`(`*`(50, `*`(`^`(c, 2)))), `*`(60, `*`...
 

> %%-%;
 

0
 

13. Équation différentielle satisfaite par la série génératrice 

> deqQ:=gfun:-rectodiffeq({recq,seq(q(i)=add(eval(U,n=i),k=0..i),i=0..1)},q(n),Q(z));
 

{`+`(`*`(`+`(`-`(`*`(24, `*`(z, `*`(`^`(pEO, 2), `*`(`^`(pNS, 2)))))), `*`(12, `*`(z, `*`(`^`(pEO, 4)))), `*`(12, `*`(z, `*`(`^`(pNS, 4)))), `-`(`*`(2, `*`(`^`(pNS, 2)))), `-`(`*`(2, `*`(`^`(pEO, 2)))...
{`+`(`*`(`+`(`-`(`*`(24, `*`(z, `*`(`^`(pEO, 2), `*`(`^`(pNS, 2)))))), `*`(12, `*`(z, `*`(`^`(pEO, 4)))), `*`(12, `*`(z, `*`(`^`(pNS, 4)))), `-`(`*`(2, `*`(`^`(pNS, 2)))), `-`(`*`(2, `*`(`^`(pEO, 2)))...
 

14. Sa solution générale 

> dsolve(op(1,deqQ),Q(z));
 

Q(z) = `+`(`/`(`*`(_C1, `*`(LegendreP(-`/`(1, 2), `/`(`*`(`+`(`-`(1), `*`(`+`(`*`(24, `*`(pEO, `*`(pNS))), `*`(4, `*`(`^`(pEO, 2))), `*`(4, `*`(`^`(pNS, 2)))), `*`(z)))), `*`(`+`(`-`(1), `*`(4, `*`(`^...
 

15. Sous forme hypergéométrique 

> res:=convert(op(2,%),hypergeom);
 

`+`(`/`(`*`(_C1, `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))))), `*`(`^`(`+`(`-`(1)...
 

16. Les conditions initiales 

On commence par isoler les arguments des séries hypergéométriques : 

> indets(res,function);
 

{hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))), hypergeom([`/`(1, 4), `/`(3, 4)], [1], `...
 

> [op(%)];
 

[hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))), hypergeom([`/`(1, 4), `/`(3, 4)], [1], `...
 

> map2(op,3,%);
 

[`+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z)))))))), `/`(`*`(`^`(`+`(`-`(`/`(1, 4)), `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))), 2)), `...
 

> map(limit,%,z=0);
 

[0, 1]
 

La seconde est donc divergente en z=0, alors que son facteur dans res a une limite finie. On en déduit _C2=0.  

> res:=subs(_C2=0,res);
 

`/`(`*`(_C1, `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))))), `*`(`^`(`+`(`-`(1), `*...
 

Il ne reste plus qu'a identifier _C1 : 

> eval(res,z=0);
 

`+`(`-`(`*`(`+`(I), `*`(_C1))))
 

> res:=subs(_C1=-1/I,res);
 

`/`(`*`(I, `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))))), `*`(`^`(`+`(`-`(1), `*`(...
 

17. La convergence de cette série 

> indets(res,function);
 

{hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z)))))))))}
 

> op([1,3],%);
 

`+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))
 

Cette fraction est clairement croissante en z pour 0. Il reste à voir si la valeur à laquelle elle atteint 1 est plus grande que 1 

> solve(%=1,z);
 

`+`(`/`(`*`(`/`(1, 4)), `*`(`+`(`*`(`^`(pEO, 2)), `*`(2, `*`(pEO, `*`(pNS))), `*`(`^`(pNS, 2))))))
 

> factor(%);
 

`+`(`/`(`*`(`/`(1, 4)), `*`(`^`(`+`(pEO, pNS), 2))))
 

Les produits pEO et pNS atteignent leur maximum lorsque pE=pO=1/2 et pN=pS=1/2, où ils valent 1/2. En toutes les autres valeurs, cette fraction est donc supérieure à 1, et donc l'argument de l'hypergéométrique reste dans son disque de convergence pour `and`(`<=`(0, z), `<=`(z, 1.)) 

18. La formule finale 

On part de l'expression générale 

> res;
 

`/`(`*`(I, `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(16, `*`(z, `*`(pEO, `*`(pNS)))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(pEO, `-`(pNS)), 2), `*`(z))))))))))), `*`(`^`(`+`(`-`(1), `*`(...
 

et il ne reste plus qu'à remplacer les probabilités et z par leurs valeurs 

> result:=subs(z=1,pEO=sqrt(1/16-c^2),pNS=1/4,res);
 

`/`(`*`(I, `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`-`(`/`(`*`(`^`(`+`(1, `-`(`*`(16, `*`(`^`(c, 2))))), `/`(1, 2))), `*`(`+`(`-`(1), `*`(4, `*`(`^`(`+`(`*`(`/`(1, 4), `*`(`^`(`+`(1, `-`(`*`(16...
 

> simplify(result);
 

`/`(`*`(`*`(2, `*`(I)), `*`(`^`(2, `/`(1, 2)), `*`(EllipticK(`/`(`*`(`^`(2, `/`(1, 2)), `*`(`^`(`+`(1, `-`(`*`(16, `*`(`^`(c, 2))))), `/`(1, 4)))), `*`(`^`(`+`(1, `*`(8, `*`(`^`(c, 2))), `*`(`^`(`+`(1...
 

> convert(%,hypergeom);
 

`/`(`*`(I, `*`(`^`(2, `/`(1, 2)), `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`/`(`*`(2, `*`(`^`(`+`(1, `-`(`*`(16, `*`(`^`(c, 2))))), `/`(1, 2)))), `*`(`+`(1, `*`(8, `*`(`^`(c, 2))), `*`(`^`(`+`(1...
 

> final:=1-1/%;
 

`+`(1, `/`(`*`(`*`(`/`(1, 2), `*`(I)), `*`(`^`(2, `/`(1, 2)), `*`(`^`(`+`(`-`(1), `-`(`*`(8, `*`(`^`(c, 2)))), `-`(`*`(`^`(`+`(1, `-`(`*`(16, `*`(`^`(c, 2))))), `/`(1, 2))))), `/`(1, 2))))), `*`(hyper...
 

Cette formule donne finalement la probabilité de repassage par l'origine en fonction de la dérive. (On pourrait aussi utiliser l'expression en termes de fonction elliptique K ci-dessus pour l'évaluer par la moyenne arithmético-géométrique comme vu en TP). 

19. 500 décimales des valeurs cherchées  

> Digits:=500:
 

> evalf(subs(c=1/10,final));
 

.4127499507154197967849233822610524344920084251494797921748395923480874788453342886715735233365764378174332715305547252553107387184884694880184562097374780527434073868916041289067196779892760446153715...
.4127499507154197967849233822610524344920084251494797921748395923480874788453342886715735233365764378174332715305547252553107387184884694880184562097374780527434073868916041289067196779892760446153715...
.4127499507154197967849233822610524344920084251494797921748395923480874788453342886715735233365764378174332715305547252553107387184884694880184562097374780527434073868916041289067196779892760446153715...
 

ceci confirme notre résultat à la question 3. 

> fsolve(final=1/2,c,0..1/4);
 

0.619139544739909428481752164732121769996387749983620760614672588599310102975961584590710564575208786137167776216460354770352165761978623892076769265210054246222936461060219831086664501115514448011690...
0.619139544739909428481752164732121769996387749983620760614672588599310102975961584590710564575208786137167776216460354770352165761978623892076769265210054246222936461060219831086664501115514448011690...
0.619139544739909428481752164732121769996387749983620760614672588599310102975961584590710564575208786137167776216460354770352165761978623892076769265210054246222936461060219831086664501115514448011690...
 

ceci confirme notre résultat à la question 10. 

Temps total pour cette session : 

> time();
 

74.475
 

>