① 用matlab求解微分方程組的數值解,原題是這樣的,y''-y-x=0,初值是y(0)=0,y'(0)=1,要求用歐拉法求解數值解
可以提供兩種方法:
1:迭代法,通過自變數步長推進求解,有一定的演算法。
2:MATLAB符號運算的自帶函數dsolve,可以求出解符號表達式,用自變數的域代替就行了。
y=dsolve('D2y-3*Dy=x^2','Dy(0)=1','y(1)=0','x');
如果要求-10到10之間的解(Y值),可令步長為0.01
x=(-10:0.01:10);
y的解:
y=subs(y,'x',x)
② 用euler方法,以步長h=0.2解初值問題,y'=-xy2-y,y(0)=1
步長h取0.01比較合適,這樣y1=2
③ MATLAB中用ode45求解微分方程,如何設置最大步長
如果你用過simulink里的ode45配置,我覺得你就會發現高贊就是在扯淡,你給的時間序列只是采樣點,根本不是設置步長用的。我最近偷懶不想用simulink就研究了下ode45的函數配置項,在matlab幫助里搜一下「Summary of ODE Options」,裡面詳細羅列了各種ode函數有的參數,最大步長想必也猜的出來,就是「MaxStep」,用法也在ode45函數的幫助里寫了,我簡單舉個例子:
tspan=1:1e-3:30;
xini=[111]';
options=odeset('MaxStep',1e-2,'RelTol',1e-2,'AbsTol',1e-4);
[~,results]=ode45(@(t,x)myodefunc(t,x,user_args),tspan,xini,options);
是的,就是通過odeset函數設置,options參數寫入。設置的細節請參考Matlab幫助。
我看還有同學在糾結ode45的固定步長設置方法,提一句:首先,ode45 是一個變步長函數,不可能設置為定步長的。其次,需要定步長的ode函數可以在Matlab幫助里搜一下「Solvers for Real-Time Simulation」,裡面詳細介紹了一些定步長的ode函數。但要注意Matlab本身是沒有這些函數的,需要用simulink模擬才能配置。
如果實在不想用simulink,那自己手寫一個函數也行(雖然我沒寫過),定步長的ode函數里常用的是ode4,也就是四階龍格庫塔演算法,可以參考這個博客:susanliuliu28-四階龍格庫塔
④ 版本matlab2014a,simulink模擬步長和演算法無法設置,求問怎麼辦
一、演算法設置
1.變步長(Variable—Step)求解器
可以選擇的變步長求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.預設情況下,具有狀態的系統用的是ode45;沒有狀態的系統用的是discrete。
1)ode45基於顯式Runge—Kutta(4,5)公式,Dormand—Prince對.它是—個單步求解器(solver)。也就是說它在計算y(tn)時,僅僅利用前一步的計算結果y(tn-1).對於大多數問題.在第一次模擬時、可用ode45試一下。
2)ode23是基於顯式Runge—Kutta(2,3).Bogackt和Shampine對.對於寬誤差容限和存在輕微剛性的系統、它比ode45更有效一些.ode23也是單步求解器。
3)odell3是變階Adams-Bashforth—Moulton PECE求解器.在誤差容限比較嚴時,它比ode45更有效.odell3是一個多步求解器,即為了計算當前的結果y(tn),不僅要知道前一步結果y(tn-1),還要知道前幾步的結果y(tn-2),y(tn-3),…;
4)odel5s是基於數值微分公式(NDFs)的變階求解器.它與後向微分公式BDFs(也叫Gear方法)有聯系.但比它更有效.ode15s是一個多步求解器,如果認為一個問題是剛性的,或者在用ode45s時模擬失敗或不夠有效時,可以試試odel5s。 odel5s是基於一到五階的NDF公式的求解器.盡管公式的階數越高結果越精確,但穩定性會差一些.如果模型是剛性的,並且要求有比較好的穩定性,應將最大的階數減小到2.選擇odel5s求解器時,對話框中會顯示這一參數. 可以用ode23求解器代替。del5s,ode23是定步長、低階求解器。
5)ode23s是基於一個2階改進的Rosenbrock公式.因為它是一個單步求解器,所以對於寬誤差容限,它比odel5s更有效.對於一些用odel5s不是很有效的剛性問題,可以用它解決。
6)ode23t是使用「自由」內插式梯形規則來實現的.如果問題是適度剛性,而且需要沒有數字阻尼的結果,可採用該求解器。
7)ode23tb是使用TR—BDF2來實現的,即基於隱式Runge—Kutta公式,其第一級是梯形規則步長和第二級是二階反向微分公式.兩級計算使用相同的迭代矩陣.與ode23s相似,對於寬誤差容限,它比odtl5s更有效。
8)discrete(變步長)是simulink在檢測到模型中沒有連續狀態時所選擇的一種求解器。
2.定步長(Flxed—Step)求解器
可以選擇的定步長求解器有:ode5,ode4,ode3,ode2,ode1和discrete。
1)ode5是ode45的一個定步長版本,基於Dormand—Prince公式。
2)ode4是RK4,基於四階Runge—Kutta公式。
3) ode3是ode23的定步長版本,基於Bogacki-Sbampine公式。
4) ode2是Heun方法,也叫作改進Euler公式。
5) odel是Euler方法。
6) discrete(定步長)是不執行積分的定步長求解器.它適用於沒有狀態的模型,以及對過零點檢測和誤差控制不重要的模型。
⑤ matlab,對於常微分方程怎樣用數值解法求函數關系
正常現象,微分方程的求解在演算法上要討論求解精度的問題,有可能和參數的數值有些關系。
比如說有時我們指定求解步長是1e-3,而實際上的求解過程可能不會按此步長計算,只是在更高精度求解結束後,以1e-3的精度給你返回求解結果。
⑥ simulink求解器solver 的設置問題
出現這個警告信息的原因:
在模擬參數設置對話框(Configuration Parameters)中,求解器選項(Solver options)的最大步長(Max Step Size)被設成「自動」(auto)。在這種情況下,離散求解器會使用最短采樣時間作為最大步長,而連續求解器使用模擬起止時間的1/50作為最大步長。模型默認的開始時間是0,結束時間是10,所以其1/50就是0.2秒。
警告的作用:
關於最大步長
最大步長是Simulink求解器按時間進行步進時所允許的最大步長——注意,這是對變步長(Variable-step)求解器而言的(你的模型出現這樣的提示,肯定是變步長求解器)。如果選擇的是定步長(Fixed-step)求解器,參數設置對話框裡面有一個類似的項是Fixed step size (fundamental sample time),同樣可以設置為auto,也會導致類似(但不完全相同)的警告。
警告的作用
按照上面所說的自動步長設置規則,你新建一個模型,默認的求解器是變步長的,而默認的最大步長是auto,這樣的參數設置對於多數模型可能是適用的,但對於有些模型,這樣的步長可能不合適,可能錯過模型的一些重要特性,從而導致模擬結果錯誤。所以Simulink發出一個警告,提醒用戶注意這個問題。
怎樣消除這個警告:
知道了原因和作用,如果你確定模擬結果可信,只是不想看到每次模擬都出來這樣一個討厭的警告,那麼也很簡單,提供兩種做法給你:
在前述模擬參數設置對話框中,求解器選項的最大步長(Max Step Size)設成一個明確的數而不是auto(隨便什麼數都可以,比如0.2)。
如果不改最大步長,那就簡單屏蔽掉警告信息,這也有兩種做法:
通過用戶界面:從模擬參數設置對話框選擇診斷選項卡(Diagnostics pane),然後設置Automatic solver parameter selection為none。
簡單的用一個命令代替上述GUI操作:
set_param(gcs,'SolverPrmCheckMsg','none')
打這么多字不容易,如果滿意,就採納了給個好評吧。
⑦ simulink求解器solver的設置問題
出現這個警告信息的原因:在模擬參數設置對話框(ConfigurationParameters)中,求解器選項(Solveroptions)的最大步長(MaxStepSize)被設成「自動」(auto)。在這種情況下,離散求解器會使用最短采樣時間作為最大步長,而連續求解器使用模擬起止時間的1/50作為最大步長。模型默認的開始時間是0,結束時間是10,所以其1/50就是0.2秒。警告的作用:關於最大步長最大步長是Simulink求解器按時間進行步進時所允許的最大步長——注意,這是對變步長(Variable-step)求解器而言的(你的模型出現這樣的提示,肯定是變步長求解器)。如果選擇的是定步長(Fixed-step)求解器,參數設置對話框裡面有一個類似的項是Fixedstepsize(fundamentalsampletime),同樣可以設置為auto,也會導致類似(但不完全相同)的警告。警告的作用按照上面所說的自動步長設置規則,你新建一個模型,默認的求解器是變步長的,而默認的最大步長是auto,這樣的參數設置對於多數模型可能是適用的,但對於有些模型,這樣的步長可能不合適,可能錯過模型的一些重要特性,從而導致模擬結果錯誤。所以Simulink發出一個警告,提醒用戶注意這個問題。怎樣消除這個警告:知道了原因和作用,如果你確定模擬結果可信,只是不想看到每次模擬都出來這樣一個討厭的警告,那麼也很簡單,提供兩種做法給你:在前述模擬參數設置對話框中,求解器選項的最大步長(MaxStepSize)設成一個明確的數而不是auto(隨便什麼數都可以,比如0.2)。如果不改最大步長,那就簡單屏蔽掉警告信息,這也有兩種做法:通過用戶界面:從模擬參數設置對話框選擇診斷選項卡(Diagnosticspane),然後設置為none。簡單的用一個命令代替上述GUI操作:set_param(gcs,'SolverPrmCheckMsg','none')打這么多字不容易,如果滿意,就採納了給個好評吧。
⑧ 最速下降法 步長
最速下降法是以負梯度方向作為極小化演算法的下降方向,又稱為梯度法,是無約束最優化中最簡單的方法。
從點x1 沿著最速下降方向d,以步長λ到達點x2,數學上可以寫為x2 = x1 + λ*d。這里的d的表達式已經從理論給出,那麼問題就變成,尋找合適的λ使得目標函數值 f(x1+λ*d)最小,這本身又是一個最小化問題。
通常所謂的迭代演算法,就是指,在某一個給定誤差范圍內,通過迭代關系 x(k +1)=x(k)+λ(k)*d(k)分別求解相應的 λ(k)和d(k)的過程。當然,每一步求解的x(k +1)都必須在約束范圍內。
簡單說來就是由起點x(k),方向d(k),步長λ(k)求出下一點x(k +1),然後將x(k +1)代回原方程,原方程變為一個關於步長λ的方程,求解方程最小時的λ值,即方程關於λ求導,等於0時的λ值。
⑨ 兩個不同演算法的simulink系統合並之後如何確定新的演算法
首先,你所說的Fixed-step不管是dscrete還是ode4,它不叫演算法,它是求解器(Solver)的類型名稱。也就是你在Simulink裡面用框圖設計好了你的模型以後,Simulink就使用你所設置的求解器來計算你的模型。
continuous states存在,是你模型本身的屬性,並不是錯誤。它只是在提醒你所設置的求解器跟模型屬性不匹配而已。
另外,如果是SimPowersystem搭建的模型,應該是在POWERGUI設置求解器吧。configuration頁面里就用默認的變步長求解器ode23t唄
⑩ 最速下降法求解,用matlb做,但是不能直接用裡面的函數,裡面的epsilon是終止誤差,不是步長,謝謝~
%預分配數組空間提高效率
x1 = zeros(1,10000); x2 = zeros(1,10000);
fval = zeros(1, 10000);
% x1,x2的初始值
x1(1) = 4; x2(1) = 4;
% 計算f初值
fval(1) = 2*x1(1)^2+0.3*x2(1)^2;
% 步長控制
step = 0.1;
% 精度控制
epsilon = 0.01;
i = 2; % 迭代計數
while 1
dir1 = 4*x1(i-1); % f對x1的偏導數
dir2 = 0.6*x2(i-1); % f對x2的偏導數
dir = sqrt(dir1^2+dir2^2); % 梯度向量的模
if (dir < 1) % 在梯度向量的模較小時,不再歸一化以提高精度
dir = 1;
end;
x1(i) = x1(i-1)-step*dir1/dir; % 新的x1
x2(i) = x2(i-1)-step*dir2/dir; % 新的x2
fval(i) = 2*x1(i)^2+0.3*x2(i)^2;
if(abs(fval(i) - fval(i-1)) < epsilon)
break;
end;
i=i+1;
end;
x1 = x1(1:i-1);
x2 = x2(1:i-1);
fval = fval(1:i-1);
% 可視化
X=-5:0.05:5;
Y=-5:0.05:5;
[X,Y] = meshgrid(X,Y);
Z = 2*X.^2+0.3*Y.^2;
surf(X,Y,Z);
shading interp
hold on;
plot3(x1, x2, fval, 'linewidth', 2, 'color', 'black');
hold off;
xlabel('x_1', 'fontsize', 16);
ylabel('x_2', 'fontsize', 16);
set(gca, 'fontsize', 12);