Updating multiple variables randomly with a constraint in a while cycle

조회 수: 1 (최근 30일)
gabriele provenza
gabriele provenza 2020년 5월 26일
댓글: Sindar 2020년 6월 1일
I have a pretty complex function that calculates a 1 by 6 vector (phi) from another 1 by 6 vector (x) like (phi)=function(x) I want now to fix phi and look for all the possible x that give me that phi with the costraint that sum(x)==1 and that for every element of x(i), 0<= x <= 1
I'm trying with a WHILE loop but I don't know how to randomly update the x variable preventing it to try the same x multiple times; my desired solution have 3 digits of accuracy like x=[0.0112 0.0997 0.157 0.227 ecc.] I know there could be a maximum of 2 solutions and I need to find them both eventually.
I don't necessarily need to use a WHILE loop If there is any MATLAB functionality that can solve this it would be great.
  댓글 수: 11
Sindar
Sindar 2020년 6월 1일
In that case, the number of possible solutions is dramatically more, and significantly harder to either count or iterate over
Sindar
Sindar 2020년 6월 1일
Therefore, my suggestion is to drop the discretization, and treat it as a continuous optimization problem. Once you have an answer, truncate it to your desired accuracy and check how poor the agreement is.

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

답변 (1개)

Jeff Miller
Jeff Miller 2020년 6월 1일
You might be able to do what you want with nested while loops, something like this. Pretty tedious though.
x = zeros(6,1);
step = 0.001; % minimum step between adjacent x values
x1max = 1 - 5*step; % x1 cannot be bigger than this because at least step is needed for all others
x(1) = 0;
nFound = 0; % number of solutions found so far
while x(1)<=x1max && nFound<2
x(1) = x(1) + step;
x2max = 1 - x(1) - 4*step;
x(2) = 0;
while x(2)<=x2max && nFound<2
x(2) = x(2) + step;
x3max = 1 - x(1) - x(2) - 3*step;
x(3) = 0;
% add further nested while loops like the above for x(3), x(4) and x(5)
% finally, deep in the midst of all these while loops, do this
x(6) = 1 - sum(x(1:5));
phi = func(x);
% check phi here.
% If phi is a solution you want, save it and increment nFound
end
end
  댓글 수: 1
Sindar
Sindar 2020년 6월 1일
While this technically would work, there are several issues for this particular problem:
  • the number of iterations is ridiculous (I estimated 8e12 above)
  • Gabriele eventually clarified that they mean 3 significant figures, not 3 places after the decimal
  • while possible, I think it unlikely that there is a way to check phi such that only the two desired solutions pass. Instead, I expect that this is a normal convergence problem where the closer x gets to x_solution, the closer phi gets to phi_solution. So, depending on what tolerance you set, you could either miss x_solution ("nah, this phi is 1e-16 off from the real one") or find solutions that are not distinct (one step apart)
  • since you are iterating through in a set order, it doesn't make much sense to use "while" over "for". It makes it harder to track progress, restart from where you left off, parallelize, etc..
Still, this is close to the optimal solution to the particular request given. But, it won't work. Conclusion: use a different algorithm

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

카테고리

Help CenterFile Exchange에서 Solver Outputs and Iterative Display에 대해 자세히 알아보기

제품


릴리스

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by