|
8 | 8 | % [t,y] = solve_ivp(__,method,wb) |
9 | 9 | % |
10 | 10 | % Copyright © 2021 Tamas Kis |
11 | | -% Last Update: 2022-06-04 |
| 11 | +% Last Update: 2022-06-05 |
12 | 12 | % Website: https://tamaskis.github.io |
13 | 13 | % Contact: tamas.a.kis@outlook.com |
14 | 14 | % |
|
131 | 131 |
|
132 | 132 | % sets propagation function for single-step methods |
133 | 133 | if strcmpi(method,'Euler') |
134 | | - propagate = @(t,y) RK1_euler(f,t,y,h); |
| 134 | + g = @(t,y) RK1_euler(f,t,y,h); |
135 | 135 | elseif strcmpi(method,'RK2') |
136 | | - propagate = @(t,y) RK2(f,t,y,h); |
| 136 | + g = @(t,y) RK2(f,t,y,h); |
137 | 137 | elseif strcmpi(method,'RK2 Heun') |
138 | | - propagate = @(t,y) RK2_heun(f,t,y,h); |
| 138 | + g = @(t,y) RK2_heun(f,t,y,h); |
139 | 139 | elseif strcmpi(method,'RK2 Ralston') |
140 | | - propagate = @(t,y) RK2_ralston(f,t,y,h); |
| 140 | + g = @(t,y) RK2_ralston(f,t,y,h); |
141 | 141 | elseif strcmpi(method,'RK3') |
142 | | - propagate = @(t,y) RK3(f,t,y,h); |
| 142 | + g = @(t,y) RK3(f,t,y,h); |
143 | 143 | elseif strcmpi(method,'RK3 Heun') |
144 | | - propagate = @(t,y) RK3_heun(f,t,y,h); |
| 144 | + g = @(t,y) RK3_heun(f,t,y,h); |
145 | 145 | elseif strcmpi(method,'RK3 Ralston') |
146 | | - propagate = @(t,y) RK3_ralston(f,t,y,h); |
| 146 | + g = @(t,y) RK3_ralston(f,t,y,h); |
147 | 147 | elseif strcmpi(method,'SSPRK3') |
148 | | - propagate = @(t,y) SSPRK3(f,t,y,h); |
| 148 | + g = @(t,y) SSPRK3(f,t,y,h); |
149 | 149 | elseif strcmpi(method,'RK4') |
150 | | - propagate = @(t,y) RK4(f,t,y,h); |
| 150 | + g = @(t,y) RK4(f,t,y,h); |
151 | 151 | elseif strcmpi(method,'RK4 3/8') |
152 | | - propagate = @(t,y) RK4_38(f,t,y,h); |
| 152 | + g = @(t,y) RK4_38(f,t,y,h); |
153 | 153 | elseif strcmpi(method,'RK4 Ralston') |
154 | | - propagate = @(t,y) RK4_ralston(f,t,y,h); |
| 154 | + g = @(t,y) RK4_ralston(f,t,y,h); |
155 | 155 | end |
156 | 156 |
|
157 | 157 | % sets propagation function for multi-step predictor methods |
158 | 158 | if strcmpi(method,'AB2') |
159 | | - propagate = @(t,F) AB2(f,t,F,h); |
| 159 | + g = @(t,F) AB2(f,t,F,h); |
160 | 160 | elseif strcmpi(method,'AB3') |
161 | | - propagate = @(t,F) AB3(f,t,F,h); |
| 161 | + g = @(t,F) AB3(f,t,F,h); |
162 | 162 | elseif strcmpi(method,'AB4') |
163 | | - propagate = @(t,F) AB4(f,t,F,h); |
| 163 | + g = @(t,F) AB4(f,t,F,h); |
164 | 164 | elseif strcmpi(method,'AB5') |
165 | | - propagate = @(t,F) AB5(f,t,F,h); |
| 165 | + g = @(t,F) AB5(f,t,F,h); |
166 | 166 | elseif strcmpi(method,'AB6') |
167 | | - propagate = @(t,F) AB6(f,t,F,h); |
| 167 | + g = @(t,F) AB6(f,t,F,h); |
168 | 168 | elseif strcmpi(method,'AB7') |
169 | | - propagate = @(t,F) AB7(f,t,F,h); |
| 169 | + g = @(t,F) AB7(f,t,F,h); |
170 | 170 | elseif strcmpi(method,'AB8') |
171 | | - propagate = @(t,F) AB8(f,t,F,h); |
| 171 | + g = @(t,F) AB8(f,t,F,h); |
172 | 172 | end |
173 | 173 |
|
174 | 174 | % sets propagation function for multi-step predictor-corrector methods |
175 | 175 | if strcmpi(method,'ABM2') |
176 | | - propagate = @(t,F) ABM2(f,t,F,h); |
| 176 | + g = @(t,F) ABM2(f,t,F,h); |
177 | 177 | elseif strcmpi(method,'ABM3') |
178 | | - propagate = @(t,F) ABM3(f,t,F,h); |
| 178 | + g = @(t,F) ABM3(f,t,F,h); |
179 | 179 | elseif strcmpi(method,'ABM4') |
180 | | - propagate = @(t,F) ABM4(f,t,F,h); |
| 180 | + g = @(t,F) ABM4(f,t,F,h); |
181 | 181 | elseif strcmpi(method,'ABM5') |
182 | | - propagate = @(t,F) ABM5(f,t,F,h); |
| 182 | + g = @(t,F) ABM5(f,t,F,h); |
183 | 183 | elseif strcmpi(method,'ABM6') |
184 | | - propagate = @(t,F) ABM6(f,t,F,h); |
| 184 | + g = @(t,F) ABM6(f,t,F,h); |
185 | 185 | elseif strcmpi(method,'ABM7') |
186 | | - propagate = @(t,F) ABM7(f,t,F,h); |
| 186 | + g = @(t,F) ABM7(f,t,F,h); |
187 | 187 | elseif strcmpi(method,'ABM8') |
188 | | - propagate = @(t,F) ABM8(f,t,F,h); |
| 188 | + g = @(t,F) ABM8(f,t,F,h); |
189 | 189 | end |
190 | 190 |
|
191 | 191 | % determines if the method is a single-step method |
|
204 | 204 | % Preallocates arrays and stores initial conditions. |
205 | 205 | % -------------------------------------------------- |
206 | 206 |
|
| 207 | + % state dimension |
| 208 | + p = length(y0); |
| 209 | + |
207 | 210 | % preallocates time vector and solution matrix |
208 | 211 | t = zeros(10000,1); |
209 | | - y = zeros(length(y0),length(t)); |
| 212 | + y = zeros(p,length(t)); |
210 | 213 |
|
211 | 214 | % stores initial conditions |
212 | 215 | t(1) = t0; |
|
228 | 231 | end |
229 | 232 |
|
230 | 233 | % state vector propagated to next sample time |
231 | | - y(:,n+1) = propagate(t(n),y(:,n)); |
| 234 | + y(:,n+1) = g(t(n),y(:,n)); |
232 | 235 |
|
233 | 236 | % increments time and loop index |
234 | 237 | t(n+1) = t(n)+h; |
|
258 | 261 | % initializes F matrix (stores function evaluations for first m |
259 | 262 | % sample times in first m columns, state vector at (m+1)th sample |
260 | 263 | % time in (m+1)th column) |
261 | | - F = zeros(length(y0),m+1); |
| 264 | + F = zeros(p,m+1); |
262 | 265 | for n = 1:m |
263 | 266 | F(:,n) = f(t(n),y(:,n)); |
264 | 267 | end |
|
274 | 277 | end |
275 | 278 |
|
276 | 279 | % updates F matrix |
277 | | - F = propagate(t(n),F); |
| 280 | + F = g(t(n),F); |
278 | 281 |
|
279 | 282 | % extracts/stores state vector propagated to next sample time |
280 | 283 | y(:,n+1) = F(:,m+1); |
|
0 commit comments