You do not want to solve it using penalties. That tends to cause problems, making the solution more difficult. At best, the optimization will probably take more function evaluations than necessary. It can still work, but if a better solution exists, you want to use it...
The idea is to perform a transformation inside your objective function. For example, to insure that your parameters are decreasing, so x(1) >= x(2) >= x(3) >= ...
function result = objfun(x)
xtrans = x(1) - cumsum(x(2:end).^2);
(do stuff here, returning result, as a function of xtrans)
end
As you should see, the vector xtrans will always obey the requirement of being decreasing. When the optimizer is done, perform the same transformation on the vector it returns, to give you the unknowns as you wish, thus a decreasing sequence.
The only time that will even result in two consecutive elements as EXACTLY equal will be when the optimizer chose one of the variables in x as identically zero. That will essentually never happen, but if you truly need a strict inequality, then you might do something like...
dxmin = 1.e-15;
xtrans = x(1) - (cumsum(x(2:end).^2 + dxmin);
That will force a tiny increment always in the variables. You can choose dxmin to be whatever you wish as realistic for your problem. Just don't make it too tiny.
There are many other ways you can use simple internal transformations to achieve your goals.