# Solving an ODE containing a function of the independent variable only known at discrete points

I'm a little new at Mathematica and I'm trying to solve the following ordinary differential equation:

$\qquad x\frac{dy(x)}{dx}+y=-p(x)$.

I have data (in a list) for $x$, and the corresponding values of $p(x)$ (also in a list). I need to solve the ODE to get a list $y(x)$ for the $x$s in the 1st list. I've been trying to use NDSolve, like so:

NDSolve[x*y'[x] + y[x] == -p, y, {x, a, b}]


with no luck.

Is this possible in Mathematica? Is there a way to do this?

• In other words are you trying to fit the differential equation to your data ? – Lotus Sep 5 '18 at 3:33
• @Lotus yes I guess so! – zack Sep 5 '18 at 3:40
• Then here is what you do: Create a cost function with your differential equation (NDSolve etc..) and the Norm between the solution and your data. Use NMinimize to minimize the cost function to get y(x) which should be a good fit – Lotus Sep 5 '18 at 3:42
• @Lotus This is a misunderstanding. If I am not mistaken, OP has just some discrete data instead a function for the excitations p (the right hand side) and wants to simply solve the ODE for y. – Henrik Schumacher Sep 5 '18 at 6:20

Why not try to fit p(x) to the data and then using DSolve? Since you did not make a MWE, I made up some data

ClearAll[x, y, p]
xData = {1, 2, 3, 4};
pData = {1, 4, 9, 16};
data = Transpose[{xData, pData}];
p[x_] = Fit[data, {1, x, x^2}, x]; (*change fit as needed*)
DSolve[x y'[x] + y[x] == -p[x], y[x], x]


• Should the data be free of noise, using Interpolation instead of Fit also comes to mind. – Henrik Schumacher Sep 5 '18 at 5:30

It is a very simple equation and I recommend to first solve it analytically. It can be done by the, say, the so-called, u*v method. The solution is as follows:

Now one can directly integrate it numerically by summing up the areas of the trapezoids formed by the points x1,x2,p1 and p2. Alternatively, one can use the advice of @Nasser and integrate the fitted function, which is easier.

Have fun!