Hello

I've got a problem I'm stuck with and would value some extra input...

Basically I'd like to be able to define a maths function with a large 
number of variables, then pass this and a map of arguments to a solve 
function which solves for whatever is not defined in the map.

Now the solve function works well, using Apache Commons Math, but it 
expects a function of one argument.  However the only way I can think of 
converting the argument list and the function into a function of one 
argument is with an intermediate function.  However approach is pretty 
messy as I need to define two functions for each maths function and list 
out the arguments twice.

Ideally I could pass the body of the maths function and a map of arguments 
directly to the solve function without having to define a function 
explicitly, and it would also work for multiple variables, but I might be 
asking a lot.

Here is what I have:-

(defn -cat
  "example math function"
  [{:keys [E A alpha t2 t1 W1 W2 g L T1 T2]}]
  (- (+ (* E A alpha (- t2 t1)) (/ (* (sq W1) (sq g) (sq L) E A) (* 24.0 
(sq T1))) T2) T1 (/ (* (sq W2) (sq g) (sq L) E A) (* 24.0 (sq T2)))))

(defn cat
  [m]
  (let [v (difference #{:E :A :alpha :t2 :t1 :W1 :W2 :g :L :T1 :T2}
                      (keys m))]
    (if-not (= (count v) 1)
      (exception "incorrect number of variables"))
    (fn [x] (-cat (assoc m (first v) x)))))

(solve (cat {:E 65000 :A 209.3 :alpha 0.000023 :t1 15 :t2 5 :W1 0.576 :W2 
0.576 :g 9.81 :L 45 :T1 1595})
         :start 1
         :min 0
         :max 100000
         :max-eval 1000)

and the solver code is on github:  
https://github.com/taprisiot/jlk.math/blob/master/src/jlk/math/optimization.clj


Now there has to be a better way of doing this but I'm stumped.  Any ideas?

As a side note, being able to define functions in infix would also be nice, 
but I don't feel up to creating a maths parser and dealing with ASTs, 
although I can visualise how I might manage the variables using this 
approach.

Thanks for any help!


- Lachlan

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to