Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Sagemath has currently no "canned" solution for this kind of integro-differential equations. However, such a problem can sometimes be transformed in (a system of) sagemath-solvable differential equations.

In the example given by Daniel Volinski in the second comment :

var("x, t")
y = function("y")
E1 = y(x) == integrate(e^(-t + x)*y(t), t, 0, x)
E1
y(x) == integrate(e^(-t + x)*y(t), t, 0, x)

[ Note : This does not seem to fullfill the definition of a [Volterra equation](https://en.wikipedia.org/wiki/Volterra_integral_equation)]

One can clean up the problem by noting that in the righ-hand size, $e^x$ is a constant not dependent of the integration variable $t$, hence expressed out of the integrand :

with assuming(x>0): E2=E1.subs(E1.rhs()==e^x*integrate(e^-t*y(t),t,0,x))
with assuming(x<0): E3=E1.subs(E1.rhs()==e^x*integrate(e^-t*y(t),t,0,x))

The identity of E2 and E3 is easily checked :

sage: E2
y(x) == e^x*integrate(e^(-t)*y(t), t, 0, x)
sage: E3
y(x) == -e^x*integrate(e^(-t)*y(t), t, x, 0)

Differentiating (the two sides of) this equation with respect to $x$ gives a differential equation solvable by Sagemath

with assuming(x>0): S2=desolve((E2/e^x).diff(x),y(x), ivar=x)
S2
_C*e^(2*x)
# Declare the integration constants :
[var(str(u)) for u in S2.variables()]
[_C, x]

However, this candidate solution satisfies the original equation only for the trivial case of the null function :

E1.substitute_function(y,S2.function(x)).unhold().solve(_C)
[_C == 0]

By the way :

sage: E1.substitute_function(y,S2.function(x)).unhold()
_C*e^(2*x) == _C*(e^(2*x) - e^x)
sage: E2.substitute_function(y,S2.function(x)).unhold()
_C*e^(2*x) == _C*(e^x - 1)*e^x

HTH,

Sagemath has currently no "canned" solution for this kind of integro-differential equations. However, such a problem can sometimes be transformed in (a system of) sagemath-solvable differential equations.

In the example given by Daniel Volinski in the second comment :

var("x, t")
y = function("y")
E1 = y(x) == integrate(e^(-t + x)*y(t), t, 0, x)
E1
y(x) == integrate(e^(-t + x)*y(t), t, 0, x)

[ Note : This does not seem to fullfill the definition of a [Volterra equation](https://en.wikipedia.org/wiki/Volterra_integral_equation)]

One can clean up the problem by noting that in the righ-hand size, $e^x$ is a constant not dependent of the integration variable $t$, hence expressed out of the integrand :

with assuming(x>0): E2=E1.subs(E1.rhs()==e^x*integrate(e^-t*y(t),t,0,x))
with assuming(x<0): E3=E1.subs(E1.rhs()==e^x*integrate(e^-t*y(t),t,0,x))

The identity of E2 and E3 is easily checked :

sage: E2
y(x) == e^x*integrate(e^(-t)*y(t), t, 0, x)
sage: E3
y(x) == -e^x*integrate(e^(-t)*y(t), t, x, 0)

Differentiating (the two sides of) this equation with respect to $x$ gives a differential equation solvable by Sagemath

with assuming(x>0): S2=desolve((E2/e^x).diff(x),y(x), ivar=x)
S2
_C*e^(2*x)
# Declare the integration constants :
[var(str(u)) for u in S2.variables()]
[_C, x]

However, this candidate solution satisfies the original equation only for the trivial case of the null function :

E1.substitute_function(y,S2.function(x)).unhold().solve(_C)
[_C == 0]

By the way :

sage: E1.substitute_function(y,S2.function(x)).unhold()
_C*e^(2*x) == _C*(e^(2*x) - e^x)
sage: E2.substitute_function(y,S2.function(x)).unhold()
_C*e^(2*x) == _C*(e^x - 1)*e^x

HTH,

EDIT : As already told, there is, to the best of my knowledge", no pre-programmed function for this in Sagemath. Feel free to submit one...

For the hell of it, I verified that a similar procedure was able to solve the equation proposed in the Mathematica example :

var("x, t, lambda_")
assume(x>0)
y = function("y")
E1 = y(x) == x^3 + lambda_*integrate((t-x)*y(t), t, 0, x)`

One notes that Sagemath insists to reformat this equation "its way" :

$$ y\left(x\right) = x^{3} - \lambda {\left(\int_{0}^{x} -t y\left(t\right)\,{d t} + \int_{0}^{x} x y\left(t\right)\,{d t}\right)} $$

Isolating the integral terms and differentiating twice gives us a second-order differential equation :

((E1-x^3)/lambda_).diff(x,2)
-(6*x - diff(y(x), x, x))/lambda_ == -y(x)

Sagemath default ODE solver (i. eI Maxima's) depends on the sign of $\lambda$ :

with assuming(lambda_>0): Sp = desolve(((E1-x^3)/lambda_).diff(x, 2), y(x), ivar=x)
[var(str(u)) for u in Sp.variables()] # Declaring the integration constants...
[_K1, _K2, lambda_, x]
Sp
_K2*cos(sqrt(lambda_)*x) + _K1*sin(sqrt(lambda_)*x) + 6*x/lambda_

Determining the constants is done by substituting in the original equation, simplifying a bit and solving for them the resulting polynomial in $x$ :

Ep = E1.substitute_function(y,Sp.function(x)).unhold().expand()-_K1*sin(x*sqrt(lambda_))-_K2*cos(x*sqrt(lambda_))
Consp = solve((Ep.lhs()-Ep.rhs()).coefficients(x, sparse=False),[_K1, _K2], solution_dict=True)
Solp = [Sp.subs(u).function(x) for u in Consp]
sage: Ep
6*x/lambda_ == -_K1*sqrt(lambda_)*x - _K2
sage: Consp
[{_K1: -6/lambda_^(3/2), _K2: 0}]
sage: Solp
[x |--> 6*x/lambda_ - 6*sin(sqrt(lambda_)*x)/lambda_^(3/2)]

$$\left[x \ {\mapsto}\ \frac{6\,x}{\lambda} - \frac{6 \, \sin\left(\sqrt{\lambda} x\right)}{\lambda^{\frac{3}{2}}}\right]$$

This unique solution is identical to Mathematica's proposed solution.

Similarly, for $\lambda<0$, we get :

with assuming(lambda_<0): Sn = desolve(((E1-x^3)/lambda_).diff(x, 2), y(x), ivar=x)
En = E1.substitute_function(y,Sn.function(x)).unhold().expand()-_K1*e^(-sqrt(-lambda_)*x)-_K2*e^(sqrt(-lambda_)*x)
Consn = solve((En.lhs()-En.rhs()).coefficients(x, sparse=False),[_K1, _K2], solution_dict=True)
Soln = [Sn.subs(u).maxima_methods().demoivre().trig_reduce().function(x) for u in Consn]
sage: Soln
[x |--> 6*x/lambda_ - 6*sin(sqrt(lambda_)*x)/lambda_^(3/2)]

This solution is formally identical to the solution obtained for $\lambda>0$ ; however, its meaning is different, $\lambda$ being negative...

HTH,