solving a linear initial value problem in MATLAB
6 次查看(过去 30 天)
显示 更早的评论
I have to solve an equation of the form: u''' = au'' + bu' + cu, u(t0) = u0, u'(t0) = ud0, u''(t0) = uddo. I have to write a function file with input u_vec: = [u0 ud0 udd0]' abc_vec: =[a b c]', t0 = initial time, tf = final time, n= number of time steps. And output: u - is a row vector of size n+1 with the first entry of u being u0 and with the (i+1) the entry of u being ui =u(ti) where i =1:100. And t = is a row vector of length n+1 containing t0....tn.
I am just stuck at where to even start with this.
Also I have to write a script file which will produce a graph of u against t. I have not a clue about how to.
I would be extremely thankful for any help.
Thank you.
0 个评论
回答(4 个)
Jan
2011-3-3
At first you have to convert the system to degree 1 - this is implied in "u_vec = [u, ud, udd]" already. Then you need an integrator. Try ODE45 and check the examples include in the help and doc.
0 个评论
Matt Tearle
2011-3-3
- Convert the third-order equation into a (3-D) first-order system
- Write a function that defines the rate equations. The system should now look like z' = f(t,z), where z = [u, u', u'']. Write your function file so that it takes t and a vector z as inputs, and returns a vector dz that represents the derivatives ([u', u'', u'''])
- Use ode45 to solve the system, giving a function handle to you function from step 2 as input
- Extract the appropriate component of the solution returned by ode45 to plot as a function of t (also returned by ode45).
Matt Tearle
2011-3-3
Oh, sorry, it looks like Jan & I both misread/misinterpreted your questions. You're supposed to write your own ode integrator? OK, I assume, then, that this is some kind of homework problem. If not, the short answer is: don't -- use ode45 instead.
So your function above is a reasonable start. A few things, though:
- You don't need a loop to calculate t. Use the range (:) operator or the linspace function.
- MATLAB uses standard mathematical order of operations, so h = tf-t0/n will calculate t0/n first, then subtract from tf
- You don't need to extract x, y, and z individually to make M. You can use fliplr and concatenation with abc_vec directly.
Next you need to write a loop to do the actual integration, using a method of your choosing. Make sure you preallocate space for the result u before you do so; then in the loop, calculate u(k) based on u(k-1). (This is much more efficient that calculating the kth u and appending it to the ones you have so far.)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!