[英]Nonlinear differential equation, how do I solve this numerically in MATLAB?
我一直在一個項目中,我需要找到給定非線性微分方程的解決方案,請參見下圖:
現在,我嘗試使用matlabs內置函數bvp4c,但是語法很困難,我不知道結果是否可靠。 對於某些值,bvp4c函數只會生成一個錯誤。 我還考慮了邊界條件,請參見下圖:
對不起,這些數字太大了。 現在我知道這不是一個數學論壇,但是我需要從數字上解決這個問題,我想用可用的最佳方法解決它。 到目前為止,我的代碼如下所示:
function [theta_0 y2]=flow_BVP
theta_0=linspace(0,1,1000); % pi/18
solinit2=bvpinit(theta_0,[0 1 1]);
sol2=bvp4c(@flow_ode,@flow_bc,solinit2);
x2=sol2.x;
y2=sol2.y(1,:);
hold on
%plot(x1,y1) %gammal
plot(x2,y2) %ny
%hold off
function v=flow_init(x)
v=[sin(x); 1; 1];
function dydx=flow_ode(x,y)
q=0.0005;
v=1;
dydx = [y(2); y(3); 2*q/v*y(1)*y(2)-4*y(2)];
function res=flow_bc(ya,yb)
res=[ya(1);yb(1);ya(2)-5.59];
重復我的問題,哪種是最好的方法,最容易,最簡單的理解和實現方法是解決該問題? 射擊吧?
最好的問候SimpleP。
該圖顯示了f與\\ theta的關系。 積分應為1。
合並積分的一般方法是將f
的反導數F
添加到ODE系統中。 也就是說,作為第四部分和變量
F' = f with F(0)=0, F(alpha)=1
而其他組件則需要轉移一個索引,
function v=flow_init(x)
v=[sin(x); 1; 1; 1-cos(x)];
function dydx=flow_ode(x,y)
% y is [ f, f', f'', F ]
q=0.0005;
v=1;
dydx = [y(2); y(3); 2*q/v*y(1)*y(2)-4*y(2); y(1)];
function res=flow_bc(ya,yb)
res=[ya(1); ya(4); yb(1); yb(4)-1];
使用python:
q, v = 0.0005, 1
def flow_ode(t,u): return [ u[1], u[2], 2*q/v*u[0]*u[1]-4*u[1], u[0] ]
def flow_bc(u0, u1): return [ u0[0], u0[3], u1[0], u1[3]-1 ]
x = x_init = np.linspace(0,1,11);
u_init = [ 6*x*(1-x), 0*x, 0*x, x ]
res = solve_bvp(flow_ode, flow_bc, x_init, u_init, tol = 1e-5)
print res.message
if res.success:
x = x_sol = np.linspace(0,1,201);
u_sol = res.sol(x_sol);
plt.subplot(2,1,1)
plt.plot(x_sol, u_sol[0]); plt.plot(x, 6*x*(1-x), lw=0.5); plt.grid()
plt.subplot(2,1,2)
plt.plot(x_sol, u_sol[3]); plt.grid()
plt.show()
可以看到,這里的初步猜測非常接近。 由於ODE是4f'+f'''=0
的小擾動,因此解必須接近其解a+b*sin(2x)+c*cos(2x)
,其邊界條件為
f(x)=A * [ (1-cos(2))*sin(2*x)-sin(2)*(1-cos(2*x)) ]
= 4*A*sin(1) * sin(x)*sin(1-x)
與A
使得積分為1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.