You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Alan <al...@gmail.com> on 2020/11/18 14:26:02 UTC

LP help

Hi commons-math

First, thanks for a handy library.

Second, I'm looking for a little help with my linear programming problem.
I'm a better coder than mathematician (and undergrad stats was a very long
time ago), so probably I'm botching that bit in a way that is amusing to
the experts :)

The problem I'm solving is adding chemicals to a body of water so as to
approach a target chemical composition. E.g. adding 1mg/l CaSO4 to the
water adds 40.08/172.9 ppm Ca and 96.07/172.19 ppm SO4 to the end result
(based on their molecular weights).

Given 9 different types of chemical addition and 6 desired ion
concentrations, I'd like to minimise the errors (error being target -
actual concentration) subject to some typical (user selected) LP-type
constraints (e.g. Ca >= 50ppm, mg/l of CaCO3 = 0).

What I have managed to do with commons-math is formulate a working LP
solution for this that can maximise or minimise the amounts of chemicals
added. *That works great, but I'm stumped for how to tackle the
minimise-errors scenario.*
*Any suggestions?*

(I'm suspecting that I'm using LP like a hammer here where I should be
using something else instead because this problem isn't a nail... )

Thanks and regards!
Alan

PS:

*More info:*
The code for the working min/max additions LP is here:
https://github.com/alanmclachlan/brewday/blob/master/src/main/java/mclachlan/brewday/math/WaterBuilder.java

The LP is formulated as follows
Let: Input Water ppm |  Target ppm
------------------------------
Ca      s1      |     t1
HCO-    s2      |     t2
SO4     s3      |     t3
Cl-     s4      |     t4
Mg      s5      |     t5
Na      s6      |     t6

Additions (mg/l):
-------------------
CaCO3_undis     x1
CaCO3_dis       x2
CaSO4           x3
CaCl            x4
MgSO4           x5
NaHCO3          x6
NaCl            x7
Ca(HCO3)        x8
MgCl            x9

Let the molecular ratio used to get from addition mg/l to
solution ppm be matrix "a":
a11...a69 (e.g. a11 = 40.08/100.09 = Ca contributed by CaCO3_undis )

So then (where <=> can be user selected >, or <, user can also exclude a
constraint):

possible ppm constraints (user selected):
- - - - - - - - - - - - - - - - -
a11.x1 + ... + a19.x9 <=> t1 - s1
a21.x1 + ... + a29.x9 <=> t2 - s2
a31.x1 + ... + a39.x9 <=> t3 - s3
a41.x1 + ... + a49.x9 <=> t4 - s4
a51.x1 + ... + a59.x9 <=> t5 - s5
a61.x1 + ... + a69.x9 <=> t6 - s6

non=negative constraint, can't have <0 mg/l:
- - - - - - - - - - - - - - - - -
xn >= 0 for n = 1..8

allowed ingredients constraints:
- - - - - - - - - - - - - - - - -
xn = 0 where the user has deselected an ingredient

objective function:
- - - - - - - - - - - - - - - - -
For MIN or MAX additions we sum the addition quantities
y = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9

Re: LP help

Posted by Gilles Sadowski <gi...@gmail.com>.
Hello.

Thanks for your interest in Commons Math, and for a very
detailed inquiry. :-)
Unfortunately, I won't have the time to delve into this.
If you'd like, there is another "hammer" which you could try:
    http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/fitting/leastsquares/package-summary.html

Best regards,
Gilles

> [...]

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org