Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Mathematica If statement inside a Do loop

  1. Apr 9, 2017 #1
    I have a Do loop running which, for some values will become complex, and I want to make it so for these situations, we take the negative root and for others the positive root. In this scenario, I've simplified what I actually have and chose to look at the case where I need it to take the negative root

    Code (Text):

    Do[e[o] = 0.5 + o, {o, 0, 10}]
    Do[If[Element[x[n, o] = (e[o] - n)^(1/2), Complexes], -[x[n, o]],
      x[n, o]], {n, -10, 10}, {o, -10, 10}]
     
    I can't seem to get the syntax right here, and if I print a table with the results it's as if the If is just being ignored.
    Ideally, this would be the best approach for my problem as my actual code is quite complex and values in the Do loops are called upon, so I fear any other method will cause grief elsewhere.

    Thanks for any help!
     
  2. jcsd
  3. Apr 9, 2017 #2

    phyzguy

    User Avatar
    Science Advisor

    When you are testing for equality, you need to use ==, not just =. For example If[a==b, step1, step2]
     
  4. Apr 10, 2017 #3
    I'm not testing for equality here, I have an expression that's defined for different values of n which I need to check if (for some values of n) x[n, o] becomes complex, and when this happens I need it to take the negative value of this.
     
  5. Apr 10, 2017 #4
    I don't know Mathematica, but I assume debugging strategy should be similar to other languages.

    If it's not throwing an error - e.g. if your syntax is correct - then what else might be going on? One thing I might do is put in a statement to print the value being passed to "If"; this way I could see whether the appropriate value appears that ought to trigger the "If". If in fact the appropriate value does appear, that would indicate something else is wrong, maybe inside the "If" statement. In some cases I might pass a static value, or isolate the part of the routine that is problematic by some means, etc. Debugging to me, provided you have the syntax right, is fairly simple-minded; you can use print and other tricks to find out what the code is actually doing, versus what you think it should be doing.
     
    Last edited: Apr 10, 2017
  6. Apr 10, 2017 #5

    jack action

    User Avatar
    Science Advisor
    Gold Member

    I'm not fluent in mathematica, but are you sure that x[n, o] = (e[o] - n)^(1/2) returns x[n, o] ? Or does it return a boolean or something like that?

    Also, in your first loop, o varies from 0 to 10, then in the 2nd loop it varies from -10 to 10. Where are the missing values of e[o] (from -10 to 0)?
     
  7. Apr 10, 2017 #6

    phyzguy

    User Avatar
    Science Advisor

    OK, I think I see what you are trying to do. Element[x, Complexes] will always return True for any number x, since all numbers, even real numbers, are elements of the complex domain. Try replacing it with Element[x, Reals], and reverse the (then, else) conditions.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted