Why can't you define an explicit constructor? For this they are needed. Moreover, why do you think that “you cannot afford the allocation of the heap”? Heap allocation is very cheap in managed languages. How did you test this assumption that you cannot afford heap allocation, or is it really that heap allocation is more expensive in the first place?
(For a type consisting of "double and multiple parameters", I suspect you're in a size where the heap distribution is actually cheaper and more efficient)
In any case, you cannot prevent the user from invoking the default constructor for the value type if he so desires. All you can do is make sure that there is a better way to initialize the value, for example, a non-default constructor, or if you cannot create it for any reason, a function that creates and initializes your value type when called.
But, of course, you have no guarantee that people actually call him.
Edit: .NET heap allocation basically consists of a simple push push operation. This is a good thing about managed (and garbage collected) languages. Runtime substantially uses a large stack as a heap, so each allocation slightly increases the stack pointer (after checking that, of course, there is enough free memory). The garbage collector then takes care of memory compression when necessary.
Thus, heap allocation is very ridiculously cheap. Of course, the additional pressure in the GC can slow you down again (although, as far as I know, the time required to go through the GC depends only on the number of living objects, and not on those that should be GC'ed, therefore with countless "dead" objects may not be a big problem), but on the other hand, stack distribution is also not free. Value types are passed by value, so every time you pass your type as a parameter to a function or return it, a copy must be made. I don’t know how great your value is, but double is 8 bytes, and given that you have some additional parameters, I will take 32 bytes. It can be so large that the extra copying required by valuetypes makes it slower than if you used heap allocation. May be.
As you can see, there are advantages for both values and reference types. I can’t say which one is faster in your case, but if I were you, I would very carefully make such assumptions. If possible, structure your code so that you can switch between the reference- and valuetype implementations and see which one works best. Alternatively, write smaller tests to try to predict how each will work on a large scale.