Explicit solution could not be found.. > In dsolve at 194
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
1 개 추천
here is my code :
>>sums u(t) v(t)
>>ode1= diff(u)==u^2/v - u
>>ode2= diff(v) == u^2-v
>>odes=[ode1;ode2]
채택된 답변
Star Strider
2017년 6월 1일
An analytic (symbolic) solution does not exist. You must us a numeric solver.
The Code —
syms T t u(t) v(t) u0 v0 Y
Du = diff(u);
Dv = diff(v);
ode1 = Du == u^2/v - u;
ode2 = Dv == u^2-v;
[ode_vf, ode_subs] = odeToVectorField(ode1,ode2);
ode_fcn = matlabFunction(ode_vf, 'vars',{T,Y});
tspan = linspace(0, 10, 150);
icv = [0; 0]+sqrt(eps);
[t,y] = ode45(ode_fcn, tspan, icv);
figure(1)
plot(t, y)
grid
댓글 수: 23
This code doesn't work for me. The first line gives me a syntax error
I need to solve these differential equations :
du/dt = u^2/v - u dv/dt = u^2 - v
Can you please tell me a way of doing this ?
The code works in R2017a. Symbolic functions were introduced in R2012a. There is no work-around if you do not have that or a later release.
My pleasure. The results from the earlier computations are:
ode_vf =
Y[2]^2 - Y[1]
Y[2]^2/Y[1] - Y[2]
ode_subs =
v
u
ode_fcn =
function_handle with value:
@(T,Y)[Y(2).^2-Y(1);Y(2).^2./Y(1)-Y(2)]
In one line:
ode_fcn = @(T,Y) [Y(2).^2-Y(1);Y(2).^2./Y(1)-Y(2)];
You can then use that with this code to integrate your equations:
tspan = linspace(0, 10, 150);
icv = [0; 0]+sqrt(eps);
[t,y] = ode45(ode_fcn, tspan, icv);
figure(1)
plot(t, y)
grid
Note that in the plot, ‘u=Y(1)’ or the blue line, and ‘v=Y(2)’ or the red line.
Thanks a lot .. This solution is so elegant. I was using runge Kutta to solve this.. Thanks again
siddharth tripathi
2017년 6월 2일
편집: Walter Roberson
2017년 6월 5일
Hi . I just have one more doubt.
When i introduce parameters into my differential equation :
du/dt= a*u^2/v - b*u
dv/dt= c*u*u - d*v
There is no change in the plot even if i change them unconditionally.. is there no scope for parameters in this code ?
Thanks.
You need to go back and include them from the beginning.
The (Revised) Code —
syms a b c d T t u(t) v(t) u0 v0 Y
Du = diff(u);
Dv = diff(v);
ode1 = Du == a*u^2/v - b*u;
ode2 = Dv == c*u^2 - d*v;
[ode_vf, ode_subs] = odeToVectorField(ode1,ode2)
ode_fcn = matlabFunction(ode_vf, 'vars',{T,Y,a,b,c,d})
producing:
ode_vf =
c*Y[2]^2 - d*Y[1]
(a*Y[2]^2)/Y[1] - b*Y[2]
ode_subs =
v
u
ode_fcn =
function_handle with value:
@(T,Y,a,b,c,d)[-d.*Y(1)+c.*Y(2).^2;-b.*Y(2)+(a.*Y(2).^2)./Y(1)]
That will work. It requires that you change your ode45 call to:
[t,y] = ode45(@(T,Y) ode_fcn(T,Y,a,b,c,d), tspan, icv);
That should work.
This is not working !
I used the earlier code with the variables included! and then i defined the values of these parameters..
Will the solution be wrong if i dont do this modification that you have mentioned here ?
PS : error that i get is
[t,y] = ode45(@(T,Y) ode_fcn(T,Y,a,b,c,d), tspan, icv);
---------------------------------------------
Error using odearguments (line 113) Inputs must be floats, namely single or double.
Error in ode45 (line 115) odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin)
You cannot use symbolic constants in the ode_fcn function.
This works:
ode_fcn = @(T,Y,a,b,c,d)[-d.*Y(1)+c.*Y(2).^2;-b.*Y(2)+(a.*Y(2).^2)./Y(1)];
a = 0.1;
b = 0.2;
c = 0.3;
d = 0.4;
tspan = [0 50];
icv = [1; 1];
[t,y] = ode45(@(T,Y) ode_fcn(T,Y,a,b,c,d), tspan, icv);
figure(1)
plot(t, y)
grid
xlabel('Time')
ylabel('Amplitude')
legend('u', 'v')
Hi Star. Thanks for all the help you provided.
Can you please let me know if i can do a fourier transform of the solution of this set of equation.. and how !
I will be much obliged.
My pleasure.
To do a Fourier transform of the results, ‘tspan’ must be a vector of times with a constant sampling time interval.
Try this:
ode_fcn = @(T,Y,a,b,c,d)[-d.*Y(1)+c.*Y(2).^2;-b.*Y(2)+(a.*Y(2).^2)./Y(1)];
a = 0.1;
b = 0.2;
c = 0.3;
d = 0.4;
L = 500;
tspan = linspace(0, 50, L);
icv = [1; 1];
[t,y] = ode45(@(T,Y) ode_fcn(T,Y,a,b,c,d), tspan, icv);
figure(1)
plot(t, y)
grid
xlabel('Time')
ylabel('Amplitude')
legend('u', 'v')
Ts = mean(diff(t)); % Sampling Interval
Fs = 1/Ts; % Sampling Frequency
Fn = Fs/2; % Nytquist Frequency
FTy = fft(y)/L; % Discrete Fourier Transform
Fv = linspace(0, 1, fix(L/2)+1)*Fn; % Frequency Vector
Iv = 1:length(Fv); % Index Vector
figure(2)
plot(Fv, abs(FTy(Iv))*2)
grid
Experiment with it to get the result you want.
I ll surely look into this and let you know if i receive what i wanted !
Star could you let me know the logic behind the use of the following and whatever these commands do :
[ode_vf, ode_subs] = odeToVectorField(ode1,ode2);
ode_fcn = matlabFunction(ode_vf, 'vars',{T,Y});
tspan = linspace(0, 10, 150);
icv = [0; 0]+sqrt(eps);
[t,y] = ode45(ode_fcn, tspan, icv);
And when you write ode_fcn you want me to write the snippet of code used above it as well right ??
This line:
[ode_vf, ode_subs] = odeToVectorField(ode1,ode2);
creates the symbolic vector field representation of the ODE function in ‘ode_vf’, and returns the substitutions the odeToVectorField made in ‘ode)_subs’, making it easier to interpret the results.
Then:
ode_fcn = matlabFunction(ode_vf, 'vars',{T,Y});
creates an anonymous function from ‘ode_vf’ and adds the time argument ‘T’ to the argument list as the numeric ODE solvers require.
The ‘tspan’ assignment creates the time vector for ode45, and icv are the initial conditions.
Finally:
[t,y] = ode45(ode_fcn, tspan, icv);
integrates the differential equation and produces the output.
I am not certain what you intend in your second comment. The code in this Comment (link) will run entirely on its own. You do not need anything else with it.
The ‘ode_fcn’ anonymous function was produced in the code in my original Answer (link). You do not need to re-derive it to use the code in my Comment.
Thanks a lot Star. I just was getting confused with the ode_vf and ode_subs thing. What do you use the icv for ?
You are the best Star. Never saw someone being so professionally helpful without any personal motives. I cannot thank you enough.
I must say i thoroughly understand non explicit solutions of differential equations because of you :)
Thank you very much!
As always, my pleasure!
Why do you use :
sqrt (eps) ??
Since eps is the smallest value (with respect to addition and subtraction) that can be represented numerically, it frequently goes to zero in some operations when used alone. Taking the square root first usually means that some small value survives calculations that square it, for example, so the result will not be zero. An alternative I also use is 1E-8, for the same reasons. It is simply a convention I have adopted for convenience.
I cannot explain why the results are so different when the input argument on the third variable in the function :
tspan = (0 , 500 ,200 )
makes so much of a difference. I mean when i use 500 instead of 200 the result is completely different. I cannot explain this !
Please can you clear this one doubt ???
You forgot to call the linspace function.
Try this:
tspan = linspace(0 ,500 ,200);
Hi star ! I hope you are doing good.
Can you please tell me how i can get graphs of u vs t and v vs t individually from this code ?
Thanks!
My pleasure.
Here you go:
syms T t u(t) v(t) u0 v0 Y
Du = diff(u);
Dv = diff(v);
ode1 = Du == u^2/v - u;
ode2 = Dv == u^2-v;
[ode_vf, ode_subs] = odeToVectorField(ode1,ode2);
ode_fcn = matlabFunction(ode_vf, 'vars',{T,Y});
tspan = linspace(0, 10, 250);
icv = [0; 0]+sqrt(eps);
[t,y] = ode45(ode_fcn, tspan, icv);
figure(1)
plot(t, y)
grid
lgndc = sym2cell(ode_subs); % Get Substituted Variables
lgnds = regexp(sprintf('%s\n', lgndc{:}), '\n','split'); % Create Cell Array
legend(lgnds(1:end-1), 'Location','NW', 'Location','NE') % Display Legend
figure(2)
subplot(2,1,1)
plot(t, y(:,1))
title([lgnds{1} '(t)'])
xlabel('\bft\rm')
ylabel('\bfAmplitude\rm')
subplot(2,1,2)
plot(t, y(:,2))
title([lgnds{2} '(t)'])
xlabel('\bft\rm')
ylabel('\bfAmplitude\rm')
추가 답변 (1개)
Walter Roberson
2017년 6월 2일
Making the assumption that you made a minor typing mistake in entering your question, and that you are asking about
syms u(t) v(t)
ode1= diff(u)==u^2/v - u;
ode2= diff(v) == u^2-v;
odes = [ode1;ode2];
dsolve(odes)
then MATLAB is not able to provide analytic solutions. However, two analytic solutions exist:
1)
u(t) = 0
v(t) = C1 * exp(-t)
where C1 is an arbitrary constant whose value depends upon the initial conditions
2)
u(t) = RootOf(-Intat(-LambertW(-C1*exp(a_)/a_)/(a_*(LambertW(-C1*exp(a_)/a_)+1)), a_ = Z_) + t + C2)
v(t) = u(t)^2/(diff(u(t), t)+u(t))}
that ugly formula for u(t) says that there is a particular function involving a ratio of LambertW formulas, and that for any given t, u(t) is the value such that the integral of the ratio, evaluate at that value, is 0.
This is ugly. But it does provide a path to an analytic solution, of sorts. But it is beyond the capacity of MATLAB.
카테고리
도움말 센터 및 File Exchange에서 Ordinary Differential Equations에 대해 자세히 알아보기
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
