Loading [MathJax]/jax/output/HTML-CSS/jax.js
Ask Your Question
1

t_span in ode_solver

asked 7 years ago

lg gravatar image

updated 7 years ago

The definition of the first time in t_span has no effect : [t_0,t_1] has the same effect than [0,t_1]. See the code below.

What to do ?


def f(t,y): return[y[0],y[1]]
T = ode_solver()
T.function=f
T.ode_solve(y_0=[1,1],t_span=[-1,0.5],num_points=100)
sx=[j[1][0] for j in T.solution]
sy=[j[1][1] for j in T.solution]
p=line(zip(sx,sy))
p.show(xmin=-3,xmax=3,ymax=3,ymin=-3)
Preview: (hide)

1 Answer

Sort by » oldest newest most voted
0

answered 7 years ago

dan_fulea gravatar image

In order to have a clear question, i have to formulate one and describe what is the mathematical, respective the sage part of the problem. My hope is, this answer is related to the posted question somehow. If not, please ignore. (And reformulate the posted question.)

Mathematical part

Let us consider the following system of differential equations (de) in the "time variable" t with the function y=(y0,y1), which is a function of t, y defined on R (or a connected part of it) with values in R2. The (de) is: y0=y0 , y1=y1 . We further consider also boundary conditions: y(t0)=(1,1) . Explicitly, y0(t0)=y1(t0)=1.

It remains to declare t0. This is the left margin (of the interval) specified in the t_span variable. If i more or less guess the right meaning of t0 and the other t0 and t1, then we want to solve the above (de) with two different values of t0:

The one (de), let us call it (de:A) is: (deA) y0=y0 , y1=y1 , y(t0)=(1,1) , t0=1 . The other (de), let us call it (de:B) is: (deB) y0=y0 , y1=y1 , y(t0)=(1,1) , t0=0 . We solve mathematically, or with sage and get the solutions: (deA) y0(t)=y1(t)=exp(t+1) , (deB) y0(t)=y1(t)=exp(t) . Now we consider these functions numerically, only some 100 points in between, and plot numerically the line with the 100 points using the t-parametrization ty(t)=(y0(t),y1(t)).

Of course, the plot will land inside the line X=Y in the coordinate system XOY.

SAGE part

We consider the code first:

T = ode_solver()
T.function = ( lambda t,y:     [ y[0],y[1] ] )

T.ode_solve( y_0 = [1,1]
             , t_span = [-1, 0.5]
             , num_points=15 )

for sol in T.solution:    print sol

It is a version of the posted code with clear spacing and an explicit print of the computed numerical solution. There are only 15 points instead of the 100 in the post, so that i can print the results below:

(-1, [1, 1])
(-0.9, [1.1051709180721718, 1.1051709180721718])
(-0.8, [1.2214027581508475, 1.2214027581508475])
(-0.7000000000000001, [1.349858807559386, 1.349858807559386])
(-0.6000000000000001, [1.4918246976162504, 1.4918246976162504])
(-0.5000000000000001, [1.6487212706652636, 1.6487212706652636])
(-0.40000000000000013, [1.8221188003441908, 1.8221188003441908])
(-0.30000000000000016, [2.0137527074108474, 2.0137527074108474])
(-0.20000000000000015, [2.225540928417404, 2.225540928417404])
(-0.10000000000000014, [2.4596031110640215, 2.4596031110640215])
(-1.3877787807814457e-16, [2.718281828345476, 2.718281828345476])
(0.09999999999999987, [3.0041660238090535, 3.0041660238090535])
(0.19999999999999987, [3.320116922571744, 3.320116922571744])
(0.2999999999999999, [3.6692966674228997, 3.6692966674228997])
(0.3999999999999999, [4.055199966612103, 4.055199966612103])
(0.4999999999999999, [4.481689070063939, 4.481689070063939])

This is the solution, and the last value fits into the theoretical computation, since

sage: exp( 0.5 + 1 )
4.48168907033806

The lines:

sx = [ j[1][0] for j in T.solution ]
sy = [ j[1][1] for j in T.solution ]

zip( sx, sy )

are now computing the same as the list comprehension:

sage: [ sol[1] for sol in T.solution ]
[[1, 1],
 [1.1051709180721718, 1.1051709180721718],
 [1.2214027581508475, 1.2214027581508475],
 [1.349858807559386, 1.349858807559386],
 [1.4918246976162504, 1.4918246976162504],
 [1.6487212706652636, 1.6487212706652636],
 [1.8221188003441908, 1.8221188003441908],
 [2.0137527074108474, 2.0137527074108474],
 [2.225540928417404, 2.225540928417404],
 [2.4596031110640215, 2.4596031110640215],
 [2.718281828345476, 2.718281828345476],
 [3.0041660238090535, 3.0041660238090535],
 [3.320116922571744, 3.320116922571744],
 [3.6692966674228997, 3.6692966674228997],
 [4.055199966612103, 4.055199966612103],
 [4.481689070063939, 4.481689070063939]]

Now we print the line for these points, but take care to stop at xmax=3 and ymax=3. OK.

p = line( [ sol[1] for sol in T.solution ] )
p.show( xmin=-3, xmax=3, ymax=3, ymin=-3 )

And please observe that the point (3,3) is reached.

Let us now do "the same", but use the t_span = [ 0, 0.5 ].

T = ode_solver()
T.function = ( lambda t,y:     [ y[0],y[1] ] )

T.ode_solve( y_0 = [1,1]
             , t_span = [ 0 , 0.5]    # WE START IN ZERO
             , num_points=5 )         # ONLY FIVE POINTS 

for sol in T.solution:    print sol

p = line( [ sol[1] for sol in T.solution ] )
p.show( xmin=-3, xmax=3, ymax=3, ymin=-3 )

This gives:

(0, [1, 1])
(0.1, [1.1051709180721718, 1.1051709180721718])
(0.2, [1.2214027581508475, 1.2214027581508475])
(0.30000000000000004, [1.349858807559386, 1.349858807559386])
(0.4, [1.4918246976162504, 1.4918246976162504])
(0.5, [1.6487212706652636, 1.6487212706652636])
Launched png viewer for Graphics object consisting of 1 graphics primitive

and in the launched viewer the line segment starts in (1,1) but does not reach (2,2).

If we have "the same effect", there is still some difference - the second parametric solution does not go "as far as the first one".

Preview: (hide)
link

Comments

Thanks for explanations !

In fact, I was also puzzled by the ode_solver feature giving solution only for positive times : t_1>t_0 if t_span=t_0,t_1] (for negative times (t_1<t_0) ,="" consider="" the="" ode="" y'="-F(-t,y)).&lt;/p">

lg gravatar imagelg ( 7 years ago )

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 7 years ago

Seen: 294 times

Last updated: Oct 01 '17