Avoid the Optimization crash

조회 수: 25 (최근 30일)
Chun Wai KO
Chun Wai KO 2022년 3월 18일
댓글: Chun Wai KO 2022년 3월 20일
Dear,
I am trying to do a tracking system
y1 and y2 are my prestored measurement data
v1q and v2q are my real time measurement data (assume)
i am trying to use optimization and interpolation together to solve this problem.
The solution is fine. In this case, it can compute the position is [4,3] which is correct.
The problem is when the program run for a while (like 1min), the system starts not responding.
I suspect that it might be the issue of computational power, so i also install the parallel computing toolbox, but the speed is still not fast and easy to be collasped.
I did some research showing that running program in gpa can increase the speed, but seems optimization is not allowed for gpu
Is there any way that i can avoid the crash?
Or can anyone tell me why it happens?
Thank you very much!!
function [out]= Untitled3(v1q,v2q,currentPandO)
%vertical coil
y1 = [3.24272914125766,2.83593179463819,2.44752064552654,2.05924203430804;
3.56186924377538,2.99624019270884,2.55850166648457,2.25064722251426;
3.57300859267674,2.90086878942227,2.48641813065078,2.19590225245865;
2.90037026793495,2.46229273094783,2.24971289753428,2.07094182706089];
%horizontal coil
y2 = [1.47213024926091,1.86376922289994,1.96744782910615,1.98366932726146;
1.65117827228894,2.08559296236809,2.31269691938603,2.28466504171977;
2.00030563764438,2.54342676501796,2.71125667257210,2.66662804271614;
2.84018880472288,3.15941792534719,3.21539885401633,3.12483330616169];
x = currentPandO(1);
y = currentPandO(2);
out = abs(interp2(y1,x,y) - v1q) + abs(interp2(y2,x,y) - v2q) ;
end
options = optimoptions(@patternsearch,'InitialMeshSize',1,'MaxFunctionEvaluations',1000,'MaxIterations',1000,'TimeLimit',0.1,'MeshTolerance',1.0000e-16,'StepTolerance',1e-16','UseParallel', true, 'UseCompletePoll', true, 'UseVectorized', false );
v1q = 2.19590225245865;
v2q = 2.66662804271614;
while(1)
disp(v1q);
disp(v2q);
solve = @(currentPandO)Untitled3(v1q,v2q,currentPandO);
A = [];
b = [];
Aeq = [];
beq = [];
lb = [1,1];
ub = [4,4];
nonlcon = [];
solution = patternsearch(solve, [1,1],A,b,Aeq,beq,lb,ub,nonlcon,options);
axes('xlim',[1 5 ], 'ylim',[1 5], 'zlim', [1 5])
view(3)
grid on
hold on
xlabel('x')
ylabel('y')
zlabel('z')
disp(v1q);
disp(v2q);
h2 = plot3(solution(1),solution(2),1,'.','color','red','MarkerSize',20);
pause(0.1)
delete(h2)
end
  댓글 수: 7
Walter Roberson
Walter Roberson 2022년 3월 18일
What variables are you optimizing over?
Chun Wai KO
Chun Wai KO 2022년 3월 18일
changing the gather(out) to out = gather(out)
now the program can run
i found that it performs well for first 20 seconds, but then it will be slowing down.
even if i stop the program, and re-run the program, the speed cannot be as fast as it was.
i need to close the Matlab and wait for a while (for example 1min) (like cooling down)
then open the matlab and run the program
then it can run fast in 20 seconds again
For my optimiation, the solve is the objective function and my initial guess is [1,1] for x and y
so basically it is trying to find the (x and y) to minimize the out
out = abs(interp2(y1,x,y) - v1q) + abs(interp2(y2,x,y) - v2q) ;

댓글을 달려면 로그인하십시오.

답변 (1개)

Walter Roberson
Walter Roberson 2022년 3월 19일
This is a proof of concept, that shows if you are willing to modify the cost from sum of abs() to sum of squares, then you can calculate the optimal position.
This particular version of the example deals with the possibility that x and y are both between 1 and 2, and does the bilinear interpolation mathematically, and then optimizes the query values.
The overall calculation would involve calculating for the nine 2 x 2 sub-arrays of y1 and y2 that are induced by taking the integer part of x and y to extract the relevant section of the matrices to be interpolated over.
To phrase that a different way: you can pre-calculate the cubic roots and square root formulas that would apply for each potential x and y combination according to what would be interpolated over; and then having done that pre-calculation, then given particular numeric x and y values, you would floor() those and use those to index the matrix of solutions -- a lookup table rather than an optimization at run-time.
It might be worth exploring to see whether only the first of the 5 potential solutions will be real-valued as hinted at when I substitute in random v1q and v2q, if you know the range of v1q and v2q.
y1 = [3.24272914125766,2.83593179463819,2.44752064552654,2.05924203430804;
3.56186924377538,2.99624019270884,2.55850166648457,2.25064722251426;
3.57300859267674,2.90086878942227,2.48641813065078,2.19590225245865;
2.90037026793495,2.46229273094783,2.24971289753428,2.07094182706089];
%horizontal coil
y2 = [1.47213024926091,1.86376922289994,1.96744782910615,1.98366932726146;
1.65117827228894,2.08559296236809,2.31269691938603,2.28466504171977;
2.00030563764438,2.54342676501796,2.71125667257210,2.66662804271614;
2.84018880472288,3.15941792534719,3.21539885401633,3.12483330616169];
syms x y v1q v2q real
assume(x >= 1 & y >=1)
weighted1 = ([2-x,x-1]+[0:2;0:-1:-2].') * y1(1:2,1:2).' * ([2-y;y-1]+[0:2;0:-1:-2]);
weighted2 = ([2-x,x-1]+[0:2;0:-1:-2].') * y2(1:2,1:2).' * ([2-y;y-1]+[0:2;0:-1:-2]);
out = (weighted1(1,1) - v1q).^2 + abs(weighted2(1,1) - v2q).^2
out = 
dx = simplify(diff(out, x))
dx = 
partialx = simplify(solve(dx, x))
Warning: Solutions are only valid under certain conditions. To include parameters and conditions in the solution, specify the 'ReturnConditions' value as 'true'.
partialx = 
outx = subs(out, x, partialx)
outx = 
dy = simplify(diff(outx,y))
dy = 
bestyinfo = solve(dy, y, 'returnconditions', true)
bestyinfo = struct with fields:
y: [5×1 sym] parameters: [1×0 sym] conditions: [5×1 sym]
besty = bestyinfo.y;
bestx = simplify(subs(partialx, y, besty), 'steps', 20);
vpa(bestx)
ans = 
vpa(besty)
ans = 
vpa(bestyinfo.conditions)
ans = 
V1Q = rand() * 3 + 1
V1Q = 1.0523
V2Q = rand() * 3 + 1
V2Q = 2.3850
vpa(subs(bestx, {v1q, v2q}, {V1Q, V2Q}))
ans = 
vpa(subs(besty, {v1q, v2q}, {V1Q, V2Q}))
ans = 
  댓글 수: 13
Chun Wai KO
Chun Wai KO 2022년 3월 20일
I am actually interested in your look up table method.
Because I read a paper about tracking system and they used look up table to solve the problem.
They used LabView to generate the look up table instead of Matlab.
I am just curious that how to implement a look up table or inverse interpolation in matlab (1D,2D,3D) so that I can find x and y (array index) by matching the v1q with y1 and v2q with y2
Chun Wai KO
Chun Wai KO 2022년 3월 20일
What I want to do is like “contour” function Find the x and y coordinate from f(x,y) (with interpolation)
But contour is just for 2D I need a 3D model.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

제품


릴리스

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by