L. Jaulin (2021). A boundary approach for set inversion, Engineering Applications of Artificial Intelligence, Volume 100, April 2021
from pyibex import * from pyibex.geometry import SepPolygon from vibes import vibes from scipy.optimize import linprog dd = Function('dd1', 'dd2', 'max((dd1-8)^2-0.001^2,(dd2-4)^2-0.001^2)') Cdd = CtcFwdBwd(dd) fdy= Function('d1','d2','d3','y1','y2','(d2-d1-y1;d3-d2-y2;d3-d1-y1-y2)') Cdy=CtcFwdBwd(fdy) fxd=Function('x1', 'x2','d1','d2','d3', '(sqrt((4-x1)^2+(6-x2)^2)-d1;sqrt((13-x1)^2+(7-x2)^2)-d2;sqrt((16-x1)^2+(10-x2)^2)-d3)') Cxd=CtcFwdBwd(fxd) class myCtc(Ctc): def __init__(C): Ctc.__init__(C, 2) def contract(C, X): x1, x2 = X[0], X[1] d1=Interval(-oo,oo) d2=Interval(-oo,oo) d3=Interval(-oo,oo) y1=Interval(-oo,oo) y2=Interval(-oo,oo) for i in range(1,10): XD=IntervalVector([x1,x2,d1,d2,d3]) Cxd.contract(XD) x1,x2,d1,d2,d3=XD[0],XD[1],XD[2],XD[3],XD[4] DY=IntervalVector([d1,d2,d3,y1,y2]) Cdy.contract(DY) d1, d2, d3, y1, y2=DY[0],DY[1],DY[2],DY[3],DY[4] DD=IntervalVector([y1,y2]) Cdd.contract(DD) y1, y2=DD[0],DD[1] #print("d1, d2, d3",d1, d2, d3) #print("y1, y2",y1, y2) #Da = IntervalVector([d1, d2, d3]) #Ya = IntervalVector([y1, y2]) #Db,Yb=contract_polytop(Da, Ya) Dans notre cas, ne contracte rien du tout. #d1, d2, d3=Db[0],Db[1],Db[2] #print('Db=',Db) DY=IntervalVector([d1,d2,d3,y1,y2]) Cdy.contract(DY) d1, d2, d3, y1, y2=DY[0],DY[1],DY[2],DY[3],DY[4] #print(d1,d2,d3) XD=IntervalVector([x1,x2,d1,d2,d3]) Cxd.contract(XD) x1,x2,d1,d2,d3=XD[0],XD[1],XD[2],XD[3],XD[4] X[0]=x1 X[1]=x2 C2= myCtc() def contract_polytop(X,Y): A = [[-1,1,0,-1,0],[0,-1,1,0,-1]] b = [0, 0] bb=[(X[0].lb(), X[0].ub()), (X[1].lb(), X[1].ub()), (X[2].lb(), X[2].ub()), (Y[0].lb(), Y[0].ub()), (Y[1].lb(), Y[1].ub())] n=5 Z=[[0,0],[0,0],[0,0],[0,0],[0,0]] for i in range(0,n): p=[0.,0.] for j in [0,1]: c = [0] * n c[i]=(j-0.5)*2.0 res=linprog(c, A_eq=A, b_eq=b, bounds=bb) p[j]=res["fun"] Z[i]=Interval(p[1],-p[0]) X=[Interval(Z[0]),Interval(Z[1]),Interval(Z[2])] Y=[Interval(Z[3]),Interval(Z[4])] return X,Y X0 = IntervalVector([[0.94,1.06],[1.94,2.06]]) vibes.beginDrawing() color = {'color_in':'black[red]', 'color_out':'blue[cyan]', 'color_maybe':'white[yellow]'} color = {'color_in':'gray[white]', 'color_out':'gray[white]', 'color_maybe':'black[yellow]'} pySIVIA(X0, C2, 0.0001, **color) vibes.axisAuto() vibes.setFigureSize(500,500) vibes.endDrawing()