Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have sets of Diff. Eq. that I'd like to solve symbolically, then substitute in numerical values for some of the symbols. I'd like to store the value for each symbol in a file, e.g., an excel spreadsheet, then substitute these values in once I have the required solutions.

I'm playing with a toy example:

I have a two-column excel file with letters in the first column and numbers in the second. I have an expression that I wanted to substitute into: f = a + b + c + d.

I import the data, s = Import["File.xlsx"], then try to substitute into my equation using a loop:

For[ i=1, i<=4, i++, f = f/.s[[1,i]][[1]]->s[[1,i]][[2]] ]

This doesn't seem to work. As far as I can tell, it's the difference between the string in the 1st column of s, ith row, e.g., a, and the variable within f that I want to substitute for.

What is the correct way to do this?

share|improve this question
add comment

1 Answer

up vote 1 down vote accepted

You are correct: there is a distinction between the string "a" and the symbol a, and that is presumably why your approach doesn't work. Whenever pattern matching doesn't work as expected it is a good idea to look at FullForm or at least InputForm to see what causes the problem. Here is the imported data (I prepared an excel file as you described and import the first sheet):

data = Import["file.xlsx"][[1]]

Looking at the InputForm it becomes clear that the result is a list of strings and numbers:

InputForm[data]

(*
==> {{{"a", 1.}, {"b", 2.}, {"c", 3.}, {"d", 4.}}}
*)

On the other hand your definition uses symbols:

f = a + b + c + d

(*
==> a + b + c + d
*)

So what you need to do is to convert either way, here I turn the strings into symbols (and of course I strongly discourage to use a For loop to do so, here I use a shortcut for Apply at 1st level):

f /. (Symbol[#1] -> #2 & @@@ data[[1]])

(*
==> 10.
*)

in fact it might be somewhat safer to actually go the other way, that is define f in terms of strings -- that way there is no danger that global definitions for any of the symbols would cause unexpected results and the whole procedure will even become more simple:

f = "a" + "b" + "c" + "d"

f /. Rule @@@ data
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.