Skip to main content

differential equations - Integrating a solution of NDSolve into table


So I am working with a set of three coupled DEs that I numerically solve. This is simple enough


NDSolve[{N1'[t] == -R1[ef]*N1[t] + b1*Γ0*N2[t], 
N2'[t] == +R1[ef]*N1[t] - Γ0*N2[t] ,
N3'[t] == b2*Γ0*N2[t] - Γ0/2 N3[t],
N1[0] == .65, N2[0] == 0, N3[0] == 0},

{N1, N2, N3}, {t, 0, 300}]

Then I integrate my N3 function (times t)


NIntegrate[t*Evaluate[N2[t] /. s], {t, 0, 300}]

In my DE's I have R=-Log[1-ef] , so what I want to know is how can I make a table (or anything) that will go through, solve this and calculate that integral as a function of ef?


Thanks



Answer



Method I


With some valuable input from @halirutan, we will be able to integrate outside ParametricNDSolve and plot the resulting function,



b1 = 1; Γ0 = 2; b2 = 1;
R1 = -Log[1 - ef]
sol = ParametricNDSolve[{N1'[t] == -R1*N1[t] + b1*Γ0*N2[t],
N2'[t] == +R1*N1[t] - Γ0*N2[t],
N3'[t] == b2*Γ0*N2[t] - Γ0/2 N3[t],
N1[0] == .65, N2[0] == 0, N3[0] == 0},
{N1, N2, N3}, {t, 0, 300}, {ef}]
Table[NIntegrate[t*N2[ef][t] /. sol, {t, 0, 300}], {ef, 0.1, 0.5, 0.1}]



{1463.78, 2935.9, 4426.87, 5950.87, 7528.18}



ListLinePlot[%, DataRange -> {0.1, 0.5}, Frame -> True]

enter image description here


Method II


Considering, @CarlWoll suggestion, we can get the same result as we have from method I.


sol1 = ParametricNDSolve[{N1'[t] == -R1*N1[t] + 
b1*Γ0*N2[t],
N2'[t] == +R1*N1[t] - Γ0*N2[t],

N3'[t] == b2*Γ0*N2[t] - Γ0/2 N3[t],
N1[0] == .65, N2[0] == 0, N3[0] == 0, N4'[t] == t N2[t],
N4[0] == 0}, {N1, N2, N3, N4}, {t, 0, 300}, {ef}];

f[ef_] = (N4[ef][t] /. sol1 /. t -> 300 - N4[ef][t] /. sol1 /. t -> 0);

Table[Evaluate[f[ef]], {ef, 0.1, 0.5, 0.1}]


{1463.78, 2935.9, 4426.87, 5950.87, 7528.18}




Method III


sol2[ef_] := 
NDSolve[{N1'[t] == -(-Log[1 - ef])*N1[t] + b1*Γ0*N2[t],
N2'[t] == (-Log[1 - ef])*N1[t] - Γ0*N2[t],
N3'[t] == b2*Γ0*N2[t] - Γ0/2 N3[t],
N1[0] == .65, N2[0] == 0, N3[0] == 0, N4'[t] == t N2[t],
N4[0] == 0}, {N1, N2, N3, N4}, {t, 0, 300}];

f[ef_] = N4[t] /. (sol2 /@ {0.1, 0.2, 0.3, 0.4, 0.5}) /. t -> 300



{{1463.78}, {2935.9}, {4426.87}, {5950.87}, {7528.18}}



Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...