Example problem definitionΒΆ
This is the problem definition for the system 1
\[y'(t) = y(y(t)) + (3+\alpha) t^{2 + \alpha} - t^{(3 + \alpha)^2}\]
where \(t \in [0,1]\) and \(y(0) = 0\).
import numpy as np
class DAE():
def __init__(self, alpha):
self.N = 1
self.dindex = [0]
self.aindex = []
self.alpha = alpha
def fun(self, x, y):
yx = y(x)
y_prime = y.scaled_derivative(x)
sigma = y.scaled_delay(x, 0)
s = y.transformed_coordinate(x)
r = np.zeros((self.N,x.shape[0]))
r[0] = y[0](sigma) + (3+self.alpha)*s**(2+self.alpha) - s**((3+self.alpha)**2) - y_prime[0]
return r
def bv(self, y):
r = np.array([y(0)[0] - 0.0, y.forward(0) - 0, y.forward(1) - 1.0])
return r
def jacobian(self, x, y):
jac, transform_jac = y.derivative_wrt_current(x, None, self.nonautonomous_jac)
J, T = y.derivative_wrt_derivative(x, self.derivative_jac)
jac += J
transform_jac += T
J, T = y.derivative_wrt_delayed(x, self.delayed_jac, 0)
jac += J
transform_jac += T
return jac, transform_jac
def bv_jacobian(self, y):
bv_jac, bv_transform_jac = y.derivative_wrt_current(0.0, self.bv_jac0, self.bv_transform_jac0)
B1, T1 = y.derivative_wrt_current(1.0, None, self.bv_transform_jac1)
bv_transform_jac += T1
return bv_jac, bv_transform_jac
def update_parameter(self, a):
self.alpha = a
def parameter_jacobian(self, x, y):
s = y.transformed_coordinate(x)
jac = np.zeros((self.N,x.shape[0]))
jac[0] = s**(2+self.alpha) + (3+self.alpha)*s**(2+self.alpha) * np.log(s) - s**((3+self.alpha)**2) * np.log(s)
bv_jac = np.zeros(3)
return jac, bv_jac
def nonautonomous_jac(self, x, y):
s = y.transformed_coordinate(x)
J = np.zeros(self.N)
J[0] = (3+self.alpha)*(2+self.alpha)*s**(2+self.alpha-1) - ((3+self.alpha)**2)*s**((3+self.alpha)**2 - 1)
return J
def derivative_jac(self, x, y):
diag = np.zeros(self.N)
diag[0] = -1.0
return np.diag(diag)
def delayed_jac(self, x, y):
J = np.zeros((self.N, self.N))
J[0,0] = 1.0
return J
def bv_jac0(self, x, y):
r = np.zeros((3,self.N))
r[0,0] = 1.0
return r
def bv_transform_jac0(self, x, y):
r = np.zeros(3)
r[1] = 1.0
return r
def bv_transform_jac1(self, x, y):
r = np.zeros(3)
r[2] = 1.0
return r
- 1
Tavernini, The Approximate Solution of Volterra Diff. Systems with State-Dependent Time Lags, SIAM J. Num. Anal. Vol. 15 (1978). 1039-1052