了解odeset函數

一、odeset函數

Matlab的ode求解器是用於解決常微分方程組(ODE)的函數。odeset函數可以使用戶控制其中大多數選項的值。這個函數返回一個structure。Odset結構體可以在ODE求解器中作為參數使用。ODE求解器採用Odset中指定的選項的值。用法如下:

options = odeset('Name1',value1,'Name2',value2,...)

options就是返回的structure,Name1,value1等為其可選項與值。

如下的代碼段,指定sine函數的初值問題求解器ode15s的舍入誤差容忍值為1e-3,絕對誤差容忍度為1e-6,並繪製結果:

tspan = [0,10]; 
y0 = 0; 
options = odeset('RelTol',1e-3, 'AbsTol', 1e-6); 
[t,y] = ode15s(@(t,y) sin(t),tspan,y0,options); 
plot(t,y)

二、odeset控制步長

在ODE的數值解法中,步長是決定數值穩定性和解的精度的因素之一。ODE求解器用絕對誤差、相對誤差和幾個事件等條件進行調整。設步長和狀態的修改發生在離散塊中的固定時刻;當狀態改變時調用事件函數。ODE求解器使用odeset函數返回的選項結構來設置絕對和相對誤差容忍度、與事件相關的參數等值。下面的代碼演示使用options參數重式調整求解器ode45的默認步長:

tspan = [0,10]; 
y0 = [1,0]; 
options = odeset('RelTol', 1e-6, 'AbsTol',1e-10,'MaxStep',0.1); 
[t,y] = ode45(@odefcn,tspan,y0,options); 

function dydt = odefcn(t,y) 
dydt = [y(2); -y(1)]; 
end

MaxStep選項是指定最大步長,ode45設置的默認步長為0.1左右。

三、odeset中的reltol

相對最大誤差範圍,定義為 abs(當前步長計算的值-olsolve函數返回的值) / max(atol,abs(當前計算的值)* reltol)。定下來的認識是在與客觀測量數據進行比較時,如果求解器成功誤差要小於設定的容忍範圍,否則算法就繼續迭代並重新計算相應的步長
在線性求解器中,誤差通常按照量表T,解向量Y和時間變量T進行測量,通過向量來測量誤差。ODE45中reltol默認值是1e-3:

tspan [0,30]; 
y0 = [2 0]; 
options = odeset('RelTol',1e-2); 
[t,y] = ode45(@odefcn,tspan,y0,options); 

function dydt = odefcn(t,y) 
dydt = [y(2); -y(1)]; 
end

四、ode to,odeset兩個events耦合怎麼寫

如果您要在多個例程中使用odeset選項,則可以創建一個options結構,然後將它傳遞給每個例程:

options = odeset('RelTol',1e-3); 
[t1,y1] = ode45(@odefcn,tspan,y0,options); 
[t2,y2] = ode23(@odefcn,tspan,y0,options);

它可以幫助改變相同的相對誤差,即儘管它的默認值不同。在ODE求解器中支持事件函數(式)。您可以在特定的時間進入或離開事件。每次輸入事件函數時,必須告訴ODE求解器是否計算相應的事件。 如果計算相應的事件,則必須提供一個組成向量的事件結果和指示哪個事件被觸發的事件檢測向量。最後,您必須告訴ODE求解器下一個時間段的結束時間。下面的示例展示了如何使用“ode23”甚至偶數次方運行情況:

tspan = [0 10]; 
y0 = 1; 
[D,c] = ode23(@ode1,tspan,y0,odeset('events',@ode2)); 
plot(D,c),xlabel('Time'),ylabel('Solution') 

function dy = ode1(t,y) 
dy = y; 
end 

function [value,isterminal,direction] = ode2(t,y) 
value = mod(t,2) == 0;     % 奇數次方 
isterminal = false;   %不終止迭代器 
direction = 0;    % 無方位可指定 
end 

五、odeset matlab

對於不同的求解器和問題,ODE求解器有很多選項設置。在控制求解器行為方面,odeset函數是個非常重要的函數。Matlab函數庫提供的ode45、ode23、ode113、ode15s等都適用odeset函數,它們都包含多個選項和值。以下是一個示例,其中設定求解器ode45的初始步長為0.01,傭金步長為0.1,相對容錯為1e-6的絕對容錯為1e-10:

tspan = [0,10]; 
y0 = [2,2]; 
options = odeset('IntialStep',0.01,'MaxStep',0.1,'RelTol',1e-6,'AbsTol',1e-10); 
[t,y] = ode45(@(t,y) [y(2) ; -y(1)],tspan,y0,options); 
plot(t,y(:,1))

六、ode to you

ODE(Ordinary Differential Equation)是指普路伐斯微分方程,大學數學中的常微分方程概念。數學家們對ODE這個領域做了很多研究,除了很多解析方法,還有很多數值求解器。比如一些經典的方法:歐拉法、改進歐拉法、龍格庫塔法(RK)等,它們都能幫助我們求解ODE問題,但是數值精度和時間效率不同。ode45函數是在所有數值求解器中精度和時間效率均衡的算法。因此,ode45是求解ODE問題的函數,類似的函數還有:ode15s、ode23、ode23tb、ode113等。

七、ode to joy

在ODE求解器中,ode45函數用於求解常微分方程組,下面是一個關於ode45函數求解簡單雙擺的例子:

%簡單雙擺

tspan=[0,70];  % 時間範圍 
y0=[0,pi/2,pi/2,0]; %初值 

[t,y] = ode45(@fxy,tspan,y0);  % 返回時間刻度“t”和值“y”

%繪製紅色線條

line([0 2*sin(y(1,1))],[0 -2*cos(y(1,1))],'color','r') %擺錘1 
hold on 

line([2*sin(y(1,1)) 2*sin(y(1,1))+2*sin(y(1,2))],[-2*cos(y(1,1)) -2*cos(y(1,1))-2*cos(y(1,2))],'color','r') %擺錘2 
axis([-3 3 -3 3]); % 繪圖區間 
whitebg('w');  % 背景顏色 
box('on')  % 繪製邊界 
title('Double Pendulum')  % 標題 
xlabel('x (m)')  % x軸標籤 
ylabel('y (m)')  % y軸標籤 

% 第一列與第三列

function dy = fxy(t,y)

 g=9.8;  % 重力加速度 
 l = 2;  % 擺桿長
 dy=zeros(4,1);
 dy(1)=y(2); 
 dy(2)=(-g*2*sin(y(1))-2*sin(y(1)-y(3))*((y(4)^2)+(y(2)^2)*cos(y(1)-y(3))))/(2-l*cos(y(1)-y(3))^2); 
 dy(3)=y(4); 
 dy(4)=(2*sin(y(1)-y(3)))*((y(2)^2)+(2*g*cos(y(1))) +(y(4)^2)*cos(y(1)-y(3)))/(2-l*cos(y(1)-y(3))^2); 

八、ode to a nightingale

Matlab的ode求解器是用於解決常微分方程組(ODE)的函數,odeset函數可以使用戶控制選項的值。ode生態系統中有一個很大的工具箱,可以輕鬆解決大多數的ODE問題。ond45是其中一種求解器,能夠順利解決大多數的知名ODE問題。

以下是ode45函數的代碼實現:

tspan = [0,10]; %時間範圍 
y0 = [1, 0]; % 初值 
options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-5]); %選項 
[t,y] = ode45(@model,tspan,y0,options); % 函數調用 

function dydt = model(t,y) 
dydt = zeros(2,1); 
dydt(1) = y(2); 
dydt(2) = -4*y(1) - 2*y(2); 
end 

plot(t,y(:,1)) 

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/253876.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 02:17
下一篇 2024-12-14 02:17

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29

發表回復

登錄後才能評論