【数学模型】基于Matlab实现洪水调度运算
?作者簡介:熱愛科研的Matlab仿真開發者,修心和技術同步精進,matlab項目合作可私信。
🍎個人主頁:Matlab科研工作室
🍊個人信條:格物致知。
更多Matlab仿真內容點擊👇
智能優化算法 ?神經網絡預測 雷達通信? 無線傳感器
信號處理 圖像處理 路徑規劃 元胞自動機 無人機
? 內容介紹
%justw 水庫調洪演算自編程序
%水量平衡方程:(Q1+Q2)*dt/2-(q1+q2)*dt/2=V2-V1
%水庫蓄泄方程:q=m1*L*(z-z0)^1.5+m2*A*(z-z0)^0.5
%zm--演算結果:[初始水位m 最高水位m 水位上漲m 初始庫容1e4m3 最大庫容1e4m3 調洪庫容1e4m3 入庫洪峰m3/s 最大泄量m3/s 洪峰削減m3/s]
%Qt--洪水過程線:{[時間h 流量m3/s]}
%Vz--水位庫容曲線:[水位m 庫容1e4m3]
%fq--蓄泄參數:[流量系數 堰頂凈寬m/洞口面積m2 堰頂高程m/洞心高程m 溢洪道(1.5)/泄洪洞(0.5)]
%z0--初始參數:[初始水位m 時段長度h 洪水線性插值<1>/樣條插值(2)]??
? 部分代碼
function zm=justw(Qt,Vz,fq,z0)
?if nargin<1, Qt=fin('Qt',''); end
if nargin<2, Vz=fin('Vz',''); end
if nargin<3, fq=fin('fq',''); end
if nargin<4, z0=fin('z0',''); end
Qt=chk('Qt',Qt);
Vz=chk('Vz',Vz);
fq=chk('fq',fq);
z0=chk('z0',z0);
if isempty(z0), z0=[min(fq(:,3)) 0.1 1]; end
save justw Qt Vz fq z0;
method={'l';'s'};
zm=zeros(length(Qt),9);
qt=cell(size(Qt));
for i=1:length(Qt)
? ?t=union(Qt{i}(:,1),[0:z0(2):max(Qt{i}(:,1))]');
? ?t(diff(t).*3600<1)=[];
? ?Q=interp1([0;Qt{i}(:,1)],[0;Qt{i}(:,2)],t,method{z0(3)});
? ?z=repmat(z0(1),size(t));
? ?for j=1:length(t)-1, z(j+1)=funz2(Q(j:j+1),t(j:j+1),z(j),Vz,fq); end
? ?q=funq(fq,z);
? ?zm(i,[1 2 4 5 7 8])=[z0(1) max(z) interp1(Vz(:,1),Vz(:,2),[z0(1) max(z)],'s') max(Q) max(q)];
? ?zm(i,[3 6 9])=[diff(zm(i,[1 2])) diff(zm(i,[4 5])) diff(zm(i,[8 7]))];
? ?qt{i}=[t Q q];
end
for i=1:length(qt)
? ?subplot(length(qt),1,i);
? ?plot(qt{i}(:,1),qt{i}(:,2),qt{i}(:,1),qt{i}(:,3));
end
str=sprintf('\n水庫調洪演算\n計算程序:justw\n計算時間:%s\n計算結果......\n',date);
str=[str sprintf('\n? ? 初始水位? ? ?最高水位? ? ?水位上漲? ? ?初始庫容? ? ?最大庫容? ? ?調洪庫容? ? ?入庫洪峰? ? ?最大泄量? ? ?洪峰削減')];
str=[str sprintf('\n? ? ? ? ? ?m? ? ? ? ? ? m? ? ? ? ? ? m? ? ? ? ?萬m3? ? ? ? ?萬m3? ? ? ? ?萬m3? ? ? ? ?m3/s? ? ? ? ?m3/s? ? ? ? ?m3/s')];
str=[str sprintf('\n%12.3f %12.3f %12.3f %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f',zm')];
disp(str);
fid=fopen('justwout.txt','w+t');
fprintf(fid,'%s\n',str);
fclose(fid);
function y=fin(opt,str)
%fin 輸入原始數據
switch opt
case 'Qt', str2='Qt--洪水過程:{[時間h 流量m3/s]} <>:';
case 'Vz', str2='Vz--水位庫容曲線:[水位m 庫容1e4m3] <>:';
case 'fq', str2='fq--蓄泄參數:[流量系數 堰頂凈寬m/洞口面積m2 堰頂高程m/洞心高程m 溢洪道(1.5)/泄洪洞(0.5)] <>:';
case 'z0', str2='z0--初始參數:[初始水位m 時段長度h<0.1> 洪水線性插值<1>/樣條插值(2)] <>:';
end
y=input([str str2]);
y=chk(opt,y);
function y=chk(opt,x)
%chk 檢查原始數據
str='\n數據錯誤,請檢查后重新......\n';
switch opt
case 'Qt'
? ?if iscell(x) & ~isempty(x)
? ? ? x=x(:);
? ? ? n=zeros(size(x));
? ? ? for i=1:length(x)
? ? ? ? ?if size(x{i},2)~=2, x{i}=x{i}'; end
? ? ? ? ?if size(x{i},2)==2
? ? ? ? ? ? if isequal(sort(x{i}(:,1)),x{i}(:,1)) & all(x{i}(:,2)>=0), n(i)=1; end
? ? ? ? ?end
? ? ? end
? ? ? if all(n), str=''; end
? ?end
%funz 迭代
dq=mean(Q)-funq(fq,z1);
dz=[0 0];
if dq>1e-4, dz(2)=0.1; elseif dq<-1e-4, dz(2)=-0.1; end
while abs(diff(dz))>0.0005
? ?dz(1)=dz(2);
? ?dz(2)=(2.*dq.*dz(1).*diff(t).*3600)./(2.*diff(interp1(Vz(:,1),Vz(:,2).*1e4,[z1 z1+dz(1)],'s'))+diff(funq(fq,[z1 z1+dz(1)])).*diff(t).*3600);
end
z2=z1+dz(2);
? 運行結果
? 參考文獻
[1]鄒進, 張勇傳. 一種多目標決策問題的模糊解法及在洪水調度中的應用[J]. 水利學報, 2003.
?? 關注我領取海量matlab電子書和數學建模資料
??部分理論引用網絡文獻,若有侵權聯系博主刪除
?
總結
以上是生活随笔為你收集整理的【数学模型】基于Matlab实现洪水调度运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技术走向管理一些思考
- 下一篇: CSS-下拉导航条