This is a very much simplified version of a problem that indicates a bug in dsolve. I am running vn 4 on a Pentium PC under Windows 3.x
The simplified version makes it easier to understand.
> dsolve(diff(z(t),t) = int(y(u),u = 0 .. t), z(t)); z(t) = 1/2*y(u)*t^2+_C1 > diff(%,t); diff(z(t),t) = y(u)*t
Certainly the integration variable 'u'
should not appear anywhere in the result and, as
shown above, if I differentiate the error is even more obvious.
The bug is removed with Maple V Release 5. (U. Klein)
Is any more information about \(y(u)\) known? Maple is treating \(y(u)\) as a constant when dsolve()
is
applied.
|\^/| Maple V Release 4 ._|\| |/|_. Copyright (c) 1981-1996 by Waterloo Maple Inc. All rights \ MAPLE / reserved. Maple and Maple V are registered trademarks of <____ ____> Waterloo Maple Inc. | Type ? for help. > dsolve(diff(z(t),t) = int(y(u),u = 0 .. t), z(t)); 2 z(t) = 1/2 y(u) t + _C1
If instead we were to use a variable a:
> dsolve(diff(z(t),t) = int(a,u = 0 .. t), z(t)); 2 z(t) = 1/2 a t + _C1
If however y(u) were defined:
> y(u):=u^3; 3 y(u) := u > dsolve(diff(z(t),t) = int(y(u),u = 0 .. t), z(t)); 5 z(t) = 1/20 t + _C1
I will however report this problem to our Math developers to investigate further.
I feel y(u) is clearly a funtion of a variable u and int(y(u),u=0..t) is clearly a function of t, although Maple certainly appears to be evaluating
int(y(u),u=0..t)
incorrectly to
y(u) * t
I think this is unreasonable and an error. Maple doesn’t evaluated the integral above wrongly
in any other context. If the form of y is unknown, the integral should surely remain
unevaluated. There is something wrong with Maple’s interpretation of int(y(u),u=0..t)
in
this context but I am not sure what.
While Stanley Houghton admits that his problem is a "very much simplified version" of the real problem of interest, I hope the following comments are of use.
Here is the original problem
> ODE1 := diff( z(t), t ) = Int( y(u), u=0..t ); t / d | ODE1 := -- z(t) = | y(u) du dt | / 0
and the solution obtained using Release 4
> dsolve( ODE1, z(t) ); t / | 2 z(t) = y(u) t | 1 du - 1/2 y(u) t + _C1 | / 0
Note that the original problem can be written in a more traditional form by differentiating the equation
> ODE2 := diff( ODE1, t ); 2 d ODE2 := --- z(t) = y(t) 2 dt
Using the fact that D(y)(0)=0
, Maple reports the solution:
> dsolve( { ODE2, D(z)(0)=0 }, z(t) ); t t / / | | z(t) = - | u y(u) du + | y(u) du t + _C1 | | / / 0 0
This is, presumably, closer to what Stan would like to see.
It would seem to me that dsolve could reasonably apply transformations that convert the input argument into a form that can be handled. Of course, I can see situations where these transformation would not be appropriate, or other problems might arise.
As a workaround you can convert the integro-differential equation to a pure differential equation,
deq := diff(z(t),t) = int(y(u),u=0..t): initcond := eval(subs(t=0, convert(deq,D))): dsolve({initcond,diff(deq,t)},{z(t)}); t t / / | | z(t) = - | u y(u) du + | y(u) du t + _C1 | | / / 0 0 subs(%,deq): %; t t / / | | | y(u) du = | y(u) du | | / / 0 0
Many thanks for the suggestion. I can indeed apply your workround to the original problem and get the correct result.
I have also discovered that I get the same result if I use Laplace mode in dsolve and, again, the result is correct if I solve
diff(z(t),t)=f(t)
and then evaluate the result after assigning
f:=t->int(y(u),u=0..t);
However, the important issue is the way ’frontend’ handles functions of the form
int(y(u),u=0..t)
for it is in frontend (used within 'dsolve'
) that the misinterpretation
occurs. It tries to freeze \(y(u)\) independent of the second argument to int. As a result, the problem
extends to other activities involving such functions.
This has been passed back to Maple who are considering it carefully. I am sure there are other ramifications.
Stanley J Houghton wrote:
> dsolve(diff(z(t),t) = int(y(u),u = 0 .. t), z(t)); z(t) = 1/2*y(u)*t^2+_C1
Yes, certainly it’s a bug. I guess "dsolve" doesn’t expect unevaluated integrals in the equations.
As a workaround, I would use something like this:
> dsolve(diff(z(t),t) = Y(t), z(t)); / | z(t) = | Y(t) dt + _C1 | / > subs(Y(t)=int(y(u),u=0..t), %); t / / | | z(t) = | | y(u) du dt + _C1 | | / / 0 > diff(%,t); t / d | ---- z(t) = | y(u) du dt | / 0