help solving differential equations
Mostrar comentarios más antiguos
hello, i tring to solve this equation
m*f'^2 -0.5(m+1)*f*f'' = m+f'''
m is a variable i need to set
my initial values are:
f(0) = f'(0) = 0
f ' (inf) =1
this is my code:
m=-0.1;
h = 0.01;
f1 = @(x, y1, y2, y3) y2;
f2 = @(x, y1, y2, y3) y3;
f3 = @(x, y1, y2, y3) -0.5*(m+1)*y1*y3 +m*(y2^2)-m;
eta = 0:h:10;
x = 0:h:10;
y1(1) = 0;
y2(1) = 0;
y3(1) = 1;
for i = 1:(length(eta)-1)
a = h.*[f1(eta(i), y1(i), y2(i), y3(i)), f2(eta(i), y1(i), y2(i), y3(i)), f3(eta(i), y1(i), y2(i), y3(i))];
b = h.*[f1(eta(i), y1(i)+a(1)/2, y2(i)+a(2)/2, y3(i)+a(3)/2), f2(eta(i)+h/2, y1(i)+a(1)/2, y2(i)+a(2)/2, y3(i)+a(3)/2), f3(eta(i)+h/2, y1(i)+a(1)/2, y2(i)+a(2)/2, y3(i)+a(3)/2)];
c = h.*[f1(eta(i), y1(i)+b(1)/2, y2(i)+b(2)/2, y3(i)+b(3)/2), f2(eta(i)+h/2, y1(i)+b(1)/2, y2(i)+b(2)/2, y3(i)+b(3)/2), f3(eta(i)+h/2, y1(i)+b(1)/2, y2(i)+b(2)/2, y3(i)+b(3)/2)];
d = h.*[f1(eta(i), y1(i)+c(1), y2(i)+c(2), y3(i)+c(3)), f2(eta(i)+h, y1(i)+c(1), y2(i)+c(2), y3(i)+c(3)), f3(eta(i)+h, y1(i)+c(1), y2(i)+c(2), y3(i)+c(3))];
y3(i+1) = y3(i)+ 1/6*(a(3)+2*b(3)+2*c(3)+d(3));
y2(i+1) = y2(i)+ 1/6*(a(2)+2*b(2)+2*c(2)+d(2));
y1(i+1) = y1(i)+ 1/6*(a(1)+2*b(1)+2*c(1)+d(1));
i'm trying to solve it with finding the f''(0) initial value and than solve the equation, but it's seem not to work. could any one help me with that?
thank u
17 comentarios
Alan Stevens
el 1 de Ag. de 2020
You have written
f3 = @(x, y1, y2, y3) -0.5*(m+1)*y1*y3 +m*(y2^2)-m;
but your mathematical equations suggest this should be:
f3 = @(x, y1, y2, y3) -0.5*(m+1)*y1*y2 +m*(y2^2)-m;
i.e. the first term in the RHS should have the y3 replaced by y2.
eden meirovich
el 1 de Ag. de 2020
Alan Stevens
el 1 de Ag. de 2020
My apologies. I had difficulty seeing the number of primes (') correctly! You are right it should be y1*y3 multiplying the 0.5(m+1) term. However, magnifying the whole equation I see that the term that is squared is also the second derivative also, so that shoud be y3^2 (unless my eyesight is really up the creek!).
Incidentally, by RHS I meant Right-Hand Side.
eden meirovich
el 1 de Ag. de 2020
John D'Errico
el 1 de Ag. de 2020
You still have a problem. (Besides the fact you are writing your ODE solving code, instead of a better tool, like ODE45.) We see this statement:
my initial values are:
f(0) = f'(0) = 0
f(inf) =1
Yet, you have set initial values as:
y1(1) = 0;
y2(1) = 0;
y3(1) = 1;
So, are you trying to adjust the initial value for y''(0) as well as the value of m, such that the value y(inf) is 1? That is, do you want to use a shooting method here?
The problem is, there are TWO unknown pieces of information, thus y''(0) AND m.
eden meirovich
el 1 de Ag. de 2020
John D'Errico
el 1 de Ag. de 2020
Then read my answer. The solution exists, but has no limit as x-->inf.
eden meirovich
el 1 de Ag. de 2020
Editada: eden meirovich
el 1 de Ag. de 2020
John D'Errico
el 1 de Ag. de 2020
Sorry, but no. The solution to your problem appears to be oscillatory. It is no more true that we can say the limit of sin(x) exists as x-->inf than does the derivative have a limit.
You certainly will+ have no success with a numerical ODE solution, because as you can see from the plot I made, these ocillations in the solution seem to be of virtually constant magnitude. So your numerical solution will need to go out a really long way, if you would hope those oscillations will die down.
Then look at the analytical solution found by dsolve. Those oscillations will continue forever, because they are composed of terms like 9*cos(3*t))/80. A limit at infinity makes no sense here.
eden meirovich
el 2 de Ag. de 2020
Alan Stevens
el 2 de Ag. de 2020
I get reasonably sensible results using Matlab's own ode45 function, by guessing initial values and adjusting them to get f'(inf) = 1 (approx!) see below. One could presumably improve on this by using fzero, or bvp4c.
% m*f'^2 -0.5(m+1)*f*f'' = m+f'''
% f(0) = f'(0) = 0 f'(inf) = 1
m = 4;
% m = -0.09;
scale = (0.5*(m+1))^0.5;
L = 7/scale;
n = 1000;
xspan = 0:L/n:L;
% Now guess initial value of d2fdx2 needed to make dfdx(inf) = 0
d2fdx2_0 = 2.4057; % for m = 4
% d2fdx2_0 = 10^-6; % for m = -0.09
F0 = [0 0 d2fdx2_0];
[x, F] = ode45(@rates, xspan, F0, [], m);
dfdx = F(:,2);
xscale = scale*x;
plot(xscale, dfdx), grid
xlabel('(0.5(m+1))^{0.5}\eta'), ylabel('f''(\eta)')
legend(['m = ', num2str(m)])
function dfdx = rates(~,F,m)
f = F(1);
dfdx = F(2);
d2fdx2 = F(3);
d3fdx3 = m*dfdx^2 - 0.5*(m+1)*f*d2fdx2 - m;
dfdx = [dfdx; d2fdx2; d3fdx3];
end
The resulting curves don't match those of your picture above exactly, but they are similar.
eden meirovich
el 2 de Ag. de 2020
Alan Stevens
el 2 de Ag. de 2020
Yes!! (You could start by estimating the slope from your published graph).
eden meirovich
el 2 de Ag. de 2020
Alan Stevens
el 2 de Ag. de 2020
If you are guessing f''(0) "by hand" it will be difficult to automate doing several values of m at once. You probably need to get fzero involved to get an auromatic estimate of f''(0). Try using fzero for one value of m, then see about automating several at once.
eden meirovich
el 2 de Ag. de 2020
Alan Stevens
el 2 de Ag. de 2020
Do something like
for i = 1:4
F0 = [0 0 d2fdx2_0(i)];
[x, F] = ode45(@rates, xspan, F0, [], m(i));
dfdx = F(:,2);
xscale = scale*x;
plot(xscale, dfdx), grid
hold on
end
xlabel('(0.5(m+1))^{0.5}\eta'), ylabel('f''(\eta)')
I've just made this up off the top of my head as I don't have time to test it right now! However, it should give you a "starter for ten".
Respuestas (3)
John D'Errico
el 1 de Ag. de 2020
I think you have multiple problems here, now that you claim to have the correct equation. DSOLVE finds an analytical solution to your ODE.
syms y(x)
dy = diff(y,x,1);
ddy = diff(y,x,2);
dddy = diff(y,x,3);
m = -0.1;
ODE = m*dy(x)^2 -0.5*(m+1)*y(x)*ddy(x) == m + dddy(x)
ODE =
- diff(y(x), x)^2/10 - (9*y(x)*diff(y(x), x, x))/20 == diff(y(x), x, x, x) - 1/10
ysol = dsolve(ode,y(0) == 0,dy(0) == 0,ddy(0) == 1)
ysol =
(9*cos(3*t))/80 + (9*exp(-t))/20 + (7*sin(3*t))/80 - (5*cos(t))/16 + (9*sin(t))/16 - (cos(2*t)*(cos(3*t)/8 - sin(3*t)/8 + (3*cos(t))/8 + sin(t)/8))/2 - (tan(t/2)*cos(t)*(tan(t/2) - 3*tan(t/2)^2 - 6*tan(t/2)^3 + 3*tan(t/2)^4 + tan(t/2)^5 - tan(t/2)^6 + 1))/(tan(t/2)^2 + 1)^4
>> pretty(ysol)
/ cos(3 t) sin(3 t) 3 cos(t) sin(t) \
cos(2 t) | -------- - -------- + -------- + ------ |
cos(3 t) 9 9 exp(-t) sin(3 t) 7 5 cos(t) 9 sin(t) \ 8 8 8 8 /
---------- + --------- + ---------- - -------- + -------- - ----------------------------------------------------
80 20 80 16 16 2
/ t \ / / t \ / t \3 / t \4 / t \5 / t \6 \
tan| - | cos(t) | tan| - | - 3 #1 - tan| - | 6 + tan| - | 3 + tan| - | - tan| - | + 1 |
\ 2 / \ \ 2 / \ 2 / \ 2 / \ 2 / \ 2 / /
- -------------------------------------------------------------------------------------------
4
(#1 + 1)
where
/ t \2
#1 == tan| - |
\ 2 /
Now, I'm not very worried about the exact solution found, because you have no idea what y''(0) should be. Instead, I want you to look at the solution itself. The solution is a sum of trig terms. In fact, we can plot it.
fplot(ysol,[0,100])

Do you see the essential nature of the solution is an oscialltory function, that does not settle down? The limit as x approaches infinity will not exist. This is no different from asking what the limit of sin(x) is, as x approaches +inf. It has no limit.
Possibly the problem is still in the equation, that you have not told us the correct form, or that I got it wrong, or that m is the wrong value, or that y''(0) was chosen incorrectly. One thing you can see is that any value for y''(0) that I choose results in a similar infinitely oscillatory behavior, that is not converging to anything. Changing m also results in just a different oscillatory behavior. So my guess is you have given us the wrong equation for the ODE.
Alan Stevens
el 3 de Ag. de 2020
I think the following does all that you want. My implementation of the legend is cumbersome, but works!
% m*f'^2 -0.5(m+1)*f*f'' = m+f'''
% f(0) = f'(0) = 0 f'(inf) = 1
m = [0 4 -0.09 1 1/3 1/2];
d2fdx2_0 = [0.33 2.4057 10^-6 1.2325 0.757 0.8995];
% m = -0.09;
figure(1)
hold on
for i=1:length(m)
scale = (0.5*(m(i)+1))^0.5;
L = 7/scale;
n = 1000;
xspan = 0:L/n:L;
% Now guess initial value of d2fdx2 needed to make dfdx(inf) = 0
%d2fdx2_0 = 2.4057; % for m = 4
% d2fdx2_0 = 10^-6; % for m = -0.09
F0 = [0 0 d2fdx2_0(i)];
[x, F] = ode45(@rates, xspan, F0, [], m(i));
dfdx = F(:,2);
xscale = scale*x;
plot(xscale, dfdx)
end
grid
xlabel('(0.5(m+1))^{0.5}\eta'), ylabel('f''(\eta)')
lg1 = [' m = ', num2str(m(1))]; lg2 = [' m = ', num2str(m(2))];
lg3 = [' m = ', num2str(m(3))]; lg4 = [' m = ', num2str(m(4))];
lg5 = [' m = ', num2str(m(5))]; lg6 = [' m = ', num2str(m(6))];
legend(lg1,lg2,lg3,lg4,lg5,lg6);
function dfdx = rates(~,F,m)
f = F(1);
dfdx = F(2);
d2fdx2 = F(3);
d3fdx3 = m*dfdx^2 - 0.5*(m+1)*f*d2fdx2 - m;
dfdx = [dfdx; d2fdx2; d3fdx3];
end
4 comentarios
eden meirovich
el 3 de Ag. de 2020
Alan Stevens
el 3 de Ag. de 2020
Try "help plot" in the command window to see the various plot options.
eden meirovich
el 3 de Ag. de 2020
Alan Stevens
el 3 de Ag. de 2020
Set up a color style list before the for loop, something like:
clr = ['k', 'c', 'm', 'r', 'b', 'g'];
then in the plot command:
plot(xscale, dfdx,clr(i))
I think that will work (though I haven't tried it!)
MINATI PATRA
el 21 de Oct. de 2020
0 votos
@ eden meirovich
What about bvp 4c?
Categorías
Más información sobre Programming en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

