How do you update variables in NDSolve for each step?

  • Thread starter Thread starter xpress907
  • Start date Start date
  • Tags Tags
    Variables
AI Thread Summary
The discussion focuses on using NDSolve to update a variable, "rand," at each integration step in a differential equation. The initial approach resulted in "rand" being constant across the entire x domain. The user sought a solution where "rand" would vary with each step in x, effectively generating a different random value for each integration step. A proposed solution involves defining "rand" as a function of x, specifically using rand[x_?NumericQ] := RandomReal[]. This allows NDSolve to evaluate "rand" as a new random number at each step, rather than a single value for the entire range. The final implementation successfully updates "rand" dynamically during the integration process, achieving the desired outcome.
xpress907
Messages
2
Reaction score
0
Im using NDSolve. I need to be able to update a variable inside NDSolve each time NDSolve takes a step. "rand" is the variable I want to update each step. I want it to be a different number each step. The below is an example that illustrates what I have currently happening ("rand" does not update for each step).
Code:
rand=RandomReal[]
Solution = y /. Flatten[ NDSolve[{y'[x] == .25 rand, y[0] == 1}, y, {x, -10, 10}]]
Plot[Evaluate[Solution[x]], {x, -10, 10}, PlotRange -> {-1.5, 1.5}]
Instead of picking 1 random variable for "rand" for the entire x domain, I want "rand" to be different for each step i.e. a different "rand" for x=1, x=2, x=3, etc.
 
Last edited:
Physics news on Phys.org
When you say each step, do you mean each step in x i.e step in the internal integration?

If so then the only way I can think of at the moment (not even sure if this is what you want) is to generate a table of random points, each associated with an x value and parse that as a function of x, i.e.

y'[x] = 0.25 f(x) where f(x) maps to your interpolated random set.
 
yes, when i say step i mean each step in x inside of NDSolve.

I think i may have found an answer to this. I am posting it incase anyone else should ever find this and need help.

The ?NumericQ prevents the expression simply getting replaced by RandomReal[].

rand[x_?NumericQ] := RandomReal[];
Solution = y /. Flatten[NDSolve[{y'[x] == .25 rand[x], y[0] == 1}, y, {x, -10, 10}, PrecisionGoal->0]]
 
You could also probably wrap it in an Evaluate[].
 

Similar threads

Replies
2
Views
2K
Replies
2
Views
2K
Replies
1
Views
3K
Replies
3
Views
3K
Replies
1
Views
2K
Replies
1
Views
9K
Replies
1
Views
4K
Replies
2
Views
3K
Back
Top