你的位置:巴比特網 > 教育 > 哪裏有自適應simpson求積算法(matlab的)?謝謝!!!急啊!!!

哪裏有自適應simpson求積算法(matlab的)?謝謝!!!急啊!!!

時間:2022-05-15 14:03瀏覽次數:60

1 楼: 會發芽的石頭


現在回答是不是有點晚啊 不過還是貼了吧

function [s,fcount]=acsimpson(f,a,b,tol)
%此方法爲自適應simpson方法求解定積分
%f爲函數,a,b分別爲積分區間,tol爲精度
%q爲積分值,fcount爲計算函數值次數

%一下爲準備輸入數據
f = fcnchk(f,'vectorized'); %定義內聯函數
h=b-a; %步長
qu=[a a+h/2 b]; %三個節點
qu(qu==0)=2^-1024; %避免計算函數值出現NAN的情況
y=feval(f,qu); %計算函數節點處的值
s=y*[1 4 1]'*h/6; %Simpson積分
fcount=0; %定義初始計數器
tol=tol*15; %調整精度

[s,fcount]=subsim(f,s,qu,y,fcount,tol); %遞歸函數
fcount=fcount+3; %計數器加上準備輸入數據的三次計算
end

%以下爲遞歸函數
function [s,fcount]=subsim(f,s,qu,y,fcount,tol)
%以下爲對qu二分,分別對兩個小區間求出Simpson積分
h=(qu(end)-qu(1))/2;
quadd=[qu(1)+h/2 qu(2)+h/2];
quadd(quadd==0)=2^-1024; %避免計算函數值出現NAN的情況
yadd=feval(f,quadd);
subs=[y(1) yadd(1) y(2) yadd(2) y(3)].*[1 4 1 4 1]*h/6;
s1=sum(subs(1:3)); %左半區間
s2=sum(subs(3:end)); %右半區間
stemp=s1+s2;
fcount=fcount+2; %每次遞歸一次,函數值運算次數增加2次
if fcount>10000
warning('MATLAB:acsimpson:MaxFcnCount', ...
'函數在某區間可能震盪嚴重')
return
end
if abs(stemp-s)s=16/15*(s1+s2)-s/15; %若滿足精度,採用一次Romberg積分,返回函數值
else %若不滿足,則繼續二分
tol=tol/2;
[s1,fcount]=subsim(f,s1,[qu(1) qu(1)+h/2 qu(2)],[y(1) yadd(1) y(2)],fcount,tol);
[s2,fcount]=subsim(f,s2,[qu(2) qu(2)+h/2 qu(end)],[y(2) yadd(2) y(3)],fcount,tol);
s=s1+s2; %將每個小區間的Romberg積分值相加

友情链接: 易財網2508網馬賽網好價網西奧網巴比特網234網聰明網抹茶網

巴比特網娛樂生活科技教育

Copyright © 2013-2022 巴比特網 版權所有