matlab 分式拟合,如何用matlab拟合微分方程
//這里是代碼窗口,請將Forcal代碼寫在下面
i: OutVector(p:k,i)= k=FCDLen(p),printff{"\r\n"},i=0,(i
!using["XSLSF"];? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//使用命名空間XSLSF
//函數定義,用于計算微分方程組中各方程右端函數值,連分式法對微分方程組積分一步函數pbs1將調用該函數f。
//t為自變量,x為函數值,dx為右端函數值(即微分方程的值)。
//該函數被調用時將用到參數A,k,這2個參數正好是擬合參數,用模塊變量傳遞這2個參數。
f(t,x,dx::A,k)={
dx=A*x/(k+x)
};
//計算相鄰兩組實驗數據的理論值與實驗值的誤差:第一組數據作為理論值的起點,用以計算出終點處的理論值,與第二組數據代表的實驗值做比較。
//hf為函數f的句柄,預先獲得了該句柄;a為工作數值;step為積分步數;eps為積分精度;t1,t2為積分的起點和終點;
//x1是對應t1的實驗數據,即積分起始點處的函數值;x_1是對應t2的實驗數據,與積分終點處的函數值做比較。
//h,i為自動變量。
t_i_j(hf,a,step,eps,t1,t2,x1,x_1:h,i)=
{
a.setra(0,x1),? ?? ?? ?? ?? ?? ?//工作數組賦初值
h=(t2-t1)/step,? ?? ?? ?? ?? ???//計算積分步長
{? ?pbs1[hf,t1,a,h,eps],? ?? ???//pbs1是連分式法對微分方程組積分一步函數
t1=t1+h? ?? ?? ?? ?? ?? ?? ?//重新計算積分起點
}.until[abs(t1-t2)
a.getra(0,&x1),? ?? ?? ?? ?? ???//用引用方式獲得積分終點處的函數值
(x1-x_1)^2? ?? ?? ?? ?? ?? ?? ? //計算并返回理論值與實驗值差的平方和
};
//目標函數定義,自變量_A,_k為需優化的參數,需要將這些參數傳遞給對應的模塊變量A,k。
//模塊變量hf為函數f的句柄,預先獲得了該句柄;Array為工作數值;step為積分步數;eps為積分精度。
k(_A,_k::hf,Array,step,eps,A,k)={
A=_A,k=_k,? ? //將優化參數_A,_k傳遞給對應的模塊變量A,k
t_i_j(hf,Array,step,eps: 1 , 2 : 8.099469866 : 12.04826079 )+
t_i_j(hf,Array,step,eps: 2 , 3 : 12.04826079 : 17.46831287 )+
t_i_j(hf,Array,step,eps: 3 , 4 : 17.46831287 : 17.62752046 )+
t_i_j(hf,Array,step,eps: 4 , 5 : 17.62752046 : 10.35408296 )+
t_i_j(hf,Array,step,eps: 5 , 6 : 10.35408296 : 6.246065848 )+
t_i_j(hf,Array,step,eps: 6 , 7 : 6.246065848 : 5.577315848 )+
t_i_j(hf,Array,step,eps: 7 , 8 : 5.577315848 : 8.379678199 )+
t_i_j(hf,Array,step,eps: 8 , 20: 8.379678199 : 6.32249814??)
};
main(:d,u,v,x,_eps,k,xx,g,i:hf,Array,step,eps)=
{
hf=HFor("f"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//模塊變量hf保存函數f的句柄,預先用函數HFor獲得該句柄
Array=new[rtoi(real_s),rtoi(15)],? ?? ?? ?? ?//申請工作數組
step=20,eps=1e-6,? ?? ?? ?? ?? ?? ?? ?? ?? ? //積分步數step越大,積分精度eps越小越精確,用于對微分方程組積分一步函數pbs1
x=new[rtoi(real_s),rtoi(3)],? ?? ?? ?? ?? ???//申請工作數組
xx=new[rtoi(real_s),rtoi(2),rtoi(3)],? ?? ???//申請工作數組
g=new[rtoi(real_s),rtoi(3)],? ?? ?? ?? ?? ???//申請工作數組
_eps=1e-50, d=1,u=1.6,v=0.4,k=500,? ?? ?? ???//變換d、u、v進一步求解,k為允許的最大迭代次數:獲得的各組解差別較大
i=jsim[HFor("k"),d,u,v,x,_eps,k,xx,g],? ?? ? //求n維極值的單形調優法
printff{"\r\n實際迭代次數={1,r}\r\n",i},? ???//輸出實際迭代次數
OutVector[x],? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//輸出最優參數值及目標函數終值
delete[x],delete[xx],delete[g],delete[Array] //銷毀申請的對象
};
總結
以上是生活随笔為你收集整理的matlab 分式拟合,如何用matlab拟合微分方程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python--socket套接字/TC
- 下一篇: matlab 曲面拟合,matlab曲面