Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
2015年 7月 21日
1
スルースゲートの水理計算
益永八尋
ゲートの水理計算(潜り流出と自由流出の場合)を行うプログラムを作成したので紹
介する。
Ⅰ.入出力画面
データ入力はゲート上流水深(h0)、ゲート下流水深(h2)(潜り流出の場合)、ゲート
幅(B)、ゲートの開き(a)である。流量(Q)、収縮係数(Cc)または流量係数(C1、
C)は計算により求めるものである。
収縮係数または流量係数は、事前に求めたデータから求めるようにプログラミングし
ている。求めた係数が正しいものであるかを視覚的に確認できるようにしている。
2015年 7月 21日
2
2015年 7月 21日
3
2015年 7月 21日
4
Ⅱ.プログラムの考え方
潜り流出における流出係数 C1は図 3-2.4 により求めることができる(水
理公式集 による)。しかし、この図から精度の高い C1を求めるには、
目視により方法では困難であると言わざるを得ない。精度の高い C1は、コ
ンピュータにより図のデータを取得し、適切な処理を行うことにより求める
ことが可能となる。どのような処理(プログラミング)をすればそれは可能
であるか。図を見れば、X軸、Y軸とも普通目盛(対数目盛ではない)であ
るため、処理方法は簡単に思える。
Ⅱ-1.潜り流出における C1の求め方 1
①C1を過程する
②h2/a=Kiのときの h0/aの値を求める。この値をMiとする
ただし、imax=7
③h2/a=Ki+1のときの h0/aの値を求める。この値をMi+1とする。
④MiとMi+1の値から h2/a=Kのときの h0/aの値Mを求める
⑤Mの値が条件として与えられたM0と等しく(ABS(M-M0)<=0.0001)なるまで C1
を仮定し直し、②に戻り試算を繰り返す。
⑥ABS(M-M0)<=0.0001になれば試算を終了し、そのときの C1が求める C1となる。
ただし、C1<=0.59 図 3-2.4による C1の最大値
2015年 7月 21日
5
使用する h2/a=Kiの
データを決定し、h0/a
の値Miを求める
条件
M=M0
K=K0
C1を仮
定
使用するh2/a=K
i+1の
データを決定し、Mi+1
の値を求める
MiとM
i+1からh
2/a=K
のときの h0/a=Mの値
を求める。
ABS(M-M0)<=
0.0001
出力
終了
Yes
No
2015年 7月 21日
6
Ⅱ-2.潜り流出における C1の求め方 2
図 3-2.4に示される中で、ハッチをした部分の範囲内にある場合には求め方が異なるためこ
の処理が必要となる。
① i=1~4
a.「①自由流出と潜り流出の境界線」の式(回帰式)と仮定した C1から h0/aの値を
求める
①-1 i=1~2
C1=0.519~0.5539の場合
b.仮定した C1のときの h0/aの値を h2/a=3のデータ群から求める。
c.「a」から求めた h2/a と h2/a=2 から仮定した C1のときの初期条件 h2/a のときの
h0/aの値を求め、この値が初期条件として与えた h0/aと等しくなるまで試算する。
①-2 i=2~3
C1=0.554~0.5739の場合
b.仮定した C1のときの h0/aの値を h2/a=4のデータ群から求める。
c.「a」から求めた h2/a と h2/a=2 から仮定した C1のときの初期条件 h2/a のときの
h0/aの値を求め、この値が初期条件として与えた h0/aと等しくなるまで試算する。
①-3 i=3~4
C1=0.574~0.5859の場合
b.仮定した C1のときの h0/aの値を h2/a=5のデータ群から求める。
c.「a」から求めた h2/aと h2/a=2から仮定した C1のときの初期条件 h2/aのときの
h0/aの値を求め、この値が初期条件として与えた h0/aと等しくなるまで試算する
② i=4~5
C1=0.536~0.5860 且つ (h0/a>=12.017 and h0/a<=16)の場合
初期条件 h0/aの値と h2/a=5および h2/a=6のデータ群から初期条件 h2/a=Xのと
きの C1を求める
② i=5~6
C1=0.498~0.536 且つ (h0/a>=13.515 and h0/a<=16)の場合
初期条件 h0/aの値と h2/a=6および h2/a=7のデータ群から初期条件 h2/a=Xのとき
の C1を求める
④ i=6~7
C1=0.455~0.498 且つ (h0/a>=13.685 and h0/a<=16)の場合
初期条件 h0/aの値と h2/a=7および h2/a=8のデータ群から初期条件 h2/a=Xのとき
2015年 7月 21日
7
の C1を求める
Ⅱ-1とⅡ-2以外の場合にはコンピュータによりC1を求めることは極めて困難である
と思われる(筆者のプログラミング能力では)。
2015年 7月 21日
8
図の説明
ハッチのない部分は(h2/a >=2)C1の求め方 1の範囲である。
図に表示されている値はコンピュータにより求めたものであり、目視により求めた値より
精度が高い。
自由流出の範囲
C1を求めることができない範囲
C1の求め方 2の範囲
h0/a=2.642
C1=0.519
h0/a=5.377
C1=0.554
h0/a=8.768
C1=0.574
h0/a=13.152
C1=0.586
h0/a=16.000
C1=0.593 h0/a=16.000
C1=0.536
h0/a=16.000
C1=0.498
h0/a=16.000
C1=0.455
h0/a=5.140
C1=0.519 h0/a=8.647
C1=0.554
h0/a=8.768
C1=0.574
h0/a=12.017
C1=0.536
h0/a=13.515
C1=0.498
h0/a=13.685
C1=0.455
2015年 7月 21日
9
h2/a=2 h0/a C1
X軸の値 Y軸の値2.0000 0.0000 12.0234 0.1023 22.0796 0.2028 32.1733 0.3014 42.3232 0.4018 52.4356 0.4581 62.5855 0.5023 72.6417 0.5189 8
データ番号h2/a=3 h0/a C1
X軸の値 Y軸の値3.0000 0.0000 13.0351 0.1032 23.0539 0.1705 33.1101 0.2028 43.2974 0.2415 53.4848 0.2783 63.6721 0.3032 73.9344 0.3401 84.2529 0.3760 94.4590 0.4018 104.7213 0.4378 115.0398 0.4793 125.2834 0.5143 135.3770 0.5456 145.3770 0.5539 15
データ番号
h2/a=4 h0/a C1
X軸の値 Y軸の値4.0000 0.0000 14.1030 0.0479 24.2717 0.1014 34.4778 0.1631 44.6464 0.2018 54.9087 0.2507 65.2459 0.3023 75.5269 0.3364 85.8454 0.3677 96.1452 0.3917 106.4824 0.4157 116.8571 0.4396 127.1569 0.4544 137.5129 0.4719 147.8501 0.4885 158.1311 0.5041 168.3747 0.5207 178.5433 0.5346 188.6557 0.5502 198.7119 0.5622 208.7682 0.5733 21
データ番号 h2/a=5 h0/a C1
X軸の値 Y軸の値5.0000 0.0000 15.2084 0.0783 25.3208 0.1060 35.4520 0.1475 45.6019 0.1816 55.6956 0.2065 65.8642 0.2406 75.9953 0.2581 86.1077 0.2774 96.2951 0.2959 106.5761 0.3171 116.8759 0.3419 127.2693 0.3677 137.6253 0.3908 148.0749 0.4157 158.5808 0.4359 169.0117 0.4535 179.5738 0.4664 18
10.0796 0.4756 1910.6604 0.4866 2011.2974 0.5005 2111.8408 0.5143 2212.2904 0.5300 2312.7026 0.5484 2412.9836 0.5659 2513.1522 0.5853 26
データ番号
Ⅲ.グラフからの読み取りデータと相関分析
表 3-1 h2/a=2のデータ 表 3-2 h2/a=3のデータ
表 3-3 h2/a=4のデータ 表 3-4 h2/a=5のデータ
2015年 7月 21日
10
h2/a=6 h0/a C1
X軸の値 Y軸の値6.0000 0.0000 16.0515 0.0323 26.0515 0.0710 36.1077 0.1051 46.2763 0.1475 56.4262 0.1779 66.5948 0.2037 76.8571 0.2415 87.1756 0.2719 97.5504 0.3014 107.9251 0.3244 118.3185 0.3493 128.7494 0.3696 139.1616 0.3871 149.6862 0.4074 15
10.1546 0.4230 1610.8103 0.4433 1711.4848 0.4590 1812.2155 0.4747 1913.0773 0.4894 2014.0141 0.5051 2114.8759 0.5171 2215.6253 0.5253 2315.8689 0.5290 24
データ番号 h2/a=7 h0/a C1
X軸の値 Y軸の値7.0000 0.0000 17.1382 0.0341 27.2131 0.0719 37.3068 0.1041 47.4567 0.1392 57.6066 0.1687 67.8314 0.1972 78.0187 0.2212 88.2810 0.2461 98.5995 0.2700 108.8993 0.2931 119.3489 0.3171 129.8361 0.3410 13
10.3981 0.3631 1410.8853 0.3797 1511.4098 0.3963 1611.9719 0.4129 1712.6838 0.4313 1813.3583 0.4452 1914.0890 0.4618 2014.9134 0.4747 2115.8876 0.4922 22
データ番号
h2/a=8 h0/a C1
X軸の値 Y軸の値8.0000 0.0000 18.2248 0.0304 28.3934 0.0747 38.5621 0.1041 48.7494 0.1336 59.0304 0.1677 69.2740 0.1945 79.6674 0.2276 89.9672 0.2507 9
10.4543 0.2820 1010.9227 0.3069 1111.3536 0.3290 1211.9344 0.3539 1312.4778 0.3724 1413.1897 0.3935 1513.8642 0.4138 1614.6136 0.4295 1715.2506 0.4442 1815.9251 0.4562 19
データ番号
表 3-5 h2/a=6のデータ 表 3-6 h2/a=7のデータ
表 3-7 h2/a=8のデータ
2015年 7月 21日
11
X軸の値 Y軸の値
h0/a C1 h2/a
1 0.8806 0.46542 1.5550 0.49033 2.0796 0.50514 2.6230 0.5189 25 3.4473 0.53096 4.3653 0.54387 4.9461 0.55028 5.3770 0.5539 39 6.1639 0.5594
10 7.2319 0.565911 8.2248 0.570512 8.7682 0.5742 413 9.7611 0.577914 11.1288 0.581615 12.1405 0.584316 13.1335 0.585317 13.1520 0.5860 518 13.9016 0.587119 14.8946 0.587120 15.8501 0.5853
番号
潜り流出・自由流出の境界線
y = 0.001x3 - 0.0168x2 + 0.0991x + 0.3795R² = 1
0.5100
0.5200
0.5300
0.5400
0.5500
0.5600
0.5700
0.5800
0.5900
0 2 4 6
流量係数C1
X=h2/a
流量係数C1
系列1
多項式 (系列1)
表 3-8 流出状態境界線のデータ
2015年 7月 21日
12
y = 0.0562x3 - 0.178x2 + 2.5574x - 2.2108R² = 1
0.000
2.000
4.000
6.000
8.000
10.000
12.000
14.000
0 2 4 6
Y=h
0/a
X=h2/a
①自由流出と潜り流出の境界線
系列1
多項式 (系列1)
y = 0.0003x3 - 0.0162x2 + 0.4818x + 0.8354R² = 1
0
1
2
3
4
5
6
0.000 5.000 10.000 15.000
Y=h
2/a
X=h0/a
②自由流出と潜り流出の境界線
系列1
多項式 (系列1)
2015年 7月 21日
13
y = 7E-05x3 - 0.0024x2 + 0.0283x + 0.4594R² = 1
0.510
0.520
0.530
0.540
0.550
0.560
0.570
0.580
0.590
0.000 5.000 10.000 15.000
流量係数
C
X=h0/a
③自由流出と潜り流出の境界での流量係数 C1
系列1
多項式 (系列1)
y = -3E-05x4 + 0.0009x3 - 0.0093x2 + 0.0523x + 0.436
R² = 0.9989
0.48
0.5
0.52
0.54
0.56
0.58
0.6
0.000 5.000 10.000 15.000
Y=流
量係数
C
X=h0/a
Henryの実験曲線式(自由流出)
系列1
多項式 (系列1)
2015年 7月 21日
14
y = 0.1163x3 + 0.0492x2 + 0.0111x + 0.6092
R² = 0.9996
0.6
0.62
0.64
0.66
0.68
0.000 0.200 0.400 0.600 0.800
収縮係数Cc
X=a/h0
Mullerの理論式
系列1
多項式 (系列1)
y = -0.3113x4 + 0.3432x3 - 0.0442x2 -0.0316x + 0.6091
R² = 0.9948
0.602
0.603
0.604
0.605
0.606
0.607
0.608
0.609
0.61
0.000 0.200 0.400 0.600
収縮係数Cc
X=a/h0
Pajerの理論式
系列1
多項式 (系列1)
2015年 7月 21日
15
Ⅲ.プログラム
1.モジュール構成
2.プログラムコード
2.1 Microsoft Excel Objects Sheets1(ゲートの水理計算)
Private Sub CommandButton1_Click()
Call Module2.Initial_Set_Top_Left
MsgBox "コネクタの初期値を取得し、設定値を変更しました"
End
End Sub
Private Sub CommandButton2_Click()
Dim h2a As Single
Dim h0a As Single
Dim a As Single
Dim B As Single
Dim C As Single
Dim CX As Single
Dim h0 As Single
Dim h2 As Single
CommandButton1
CommandButton2
2015年 7月 21日
16
Dim Q As Single
Dim g As Single
'--------------------
g = 9.80653
'--------------------
Sheets("ゲートの水理計算").Select
h0 = Cells(14, 4)
h2 = Cells(15, 4)
B = Cells(17, 4)
a = Cells(18, 4)
' ------------------
h0a = h0 / a
h2a = h2 / a
CX = Serch_CX(h2a, h0a)
Q = CX * a * B * (2 * g * h0) ^ 0.5
'----------------------------
Cells(13, 4) = Q
Cells(16, 4) = CX
Cells(16, 5) = "潜り流出"
Call Module2.Get_Top_Left(CX, h0a)
MsgBox "計算は正常に終了しました。"
End
End Sub
Private Sub CommandButton3_Click()
Dim a As Single
Dim B As Single
Dim C As Single
Dim CC As Single
Dim h0 As Single
Dim Q As Single
Dim g As Single
Dim strMas(3) As String
'--------------------
2015年 7月 21日
17
g = 9.80653
UserForm1.Show
'----------------------
Sheets("ゲートの水理計算").Select
'----------------------
h0 = Cells(14, 4)
B = Cells(17, 4)
a = Cells(18, 4)
'----------------------
Select Case Select_No
Case 1
strMas(1) = "Henryの実験式"
'X=h0/a
X = h0 / a
CC = -0.00003 * X ^ 4 + 0.0009 * X ^ 3 - 0.0093 * X ^ 2 + 0.0523 * X + 0.436
Q = CC * a * B * (2 * g * h0) ^ 0.5
Cells(16, 2) = "流量係数 C)"
Case 2
strMas(2) = "Mullerの理論曲線"
'X=a/h0
X = a / h0
CC = 0.1163 * X ^ 3 + 0.0492 * X ^ 2 + 0.0111 * X + 0.6092
Q = CC * a * B * ((2 * g * (h0 - CC * a)) / (1 - (CC * a / h0) ^ 2)) ^ 0.5
Cells(16, 2) = "収縮係数 Cc)"
Case 3
strMas(3) = "Pajer の理論曲線"
'X=a/h0
X = a / h0
CC = -0.3113 * X ^ 4 + 0.3432 * X ^ 3 - 0.0442 * X ^ 2 - 0.0316 * X + 0.6091
Q = CC * a * B * ((2 * g * (h0 - CC * a)) / (1 - (CC * a / h0) ^ 2)) ^ 0.5
Cells(16, 2) = "収縮係数 Cc)"
End Select
'----------------------------
Cells(13, 4) = Q
Cells(16, 4) = CC
Cells(16, 5) = strMas(Select_No)
2015年 7月 21日
18
MsgBox "計算は正常に終了しました。"
End
End Sub
2.2 Microsoft Excel Objects Sheets3(流量係数の求値)
Private Sub CommandButton1_Click()
Dim X(40) As Single
Dim Y(40) As Single
Dim N As Integer
Dim I As Integer
Dim J As Integer
Dim AA As String
Dim h0a As Single
Dim h2a As String
'--------------------
h2a = Cells(85, 4)
h0a = Cells(82, 4)
'------------------------
For I = 1 To 100
AA = Sheets("ゲートの水理計算").Cells(33 + I, 3)
'--------------------------
If Right(AA, 1) = h2a Then
For J = 1 To 40
If Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 4) = "" Then
N = J
Exit For
Else
X(J) = Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 4)
Y(J) = Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 5)
CommandButton1
2015年 7月 21日
19
End If
Next J
End If
'-------------
If N <> 0 Then
Exit For
End If
Next I
'---------------------
C1 = Serch_C1(N, X(), Y(), h0a)
Sheets("流量係数の求値").Select
Cells(85, 3) = C1
End Sub
2015年 7月 21日
20
2.3 Userform
Private Sub CommandButton1_Click()
If UserForm1.OptionButton1 = True Then
Select_No = 1
ElseIf UserForm1.OptionButton2 = True Then
Select_No = 2
ElseIf UserForm1.OptionButton3 = True Then
Select_No = 3
End If
'------------------------
Unload Me
End Sub
Private Sub CommandButton2_Click()
End
End Sub
Private Sub UserForm_Click()
End Sub
CommandButton1
CommandButton2
OptionButton1
OptionButton2
OptionButton3
2015年 7月 21日
21
2.4 標準Module
2.4.1 Module1
Public C1 As Single
Public C2 As Single
Public h0aM(2) As Single
Public Hantei As String
Public Select_No As Integer
Public Function Serch_h0aX(N As Integer, X() As Single, Y() As Single, CX As Single, m As Integer)
'CXを仮定したときの h0aの値を求める Function
Dim I As Integer
'---------------------
For I = 1 To N
If CX >= Y(I) And CX < Y(I + 1) Then
Serch_h0aX = (X(I + 1) - X(I)) / (Y(I + 1) - Y(I)) * (CX - Y(I)) + X(I)
h0aM(m) = Serch_h0aX
Sheets("ゲートの水理計算").Select
Cells(14 + m, 12) = h0aM(m)
Exit For
End If
Next I
'----------------------------------------
End Function
Public Function Serch_CX(h2a As Single, h0a As Single)
'CXを仮定し、試算により流量係数 C1を求める Function
Dim X(40) As Single
Dim Y(40) As Single
Dim N As Integer
Dim N1 As Integer
Dim N2 As Integer
Dim I As Integer
Dim J As Integer
Dim AA As String
Dim h2a1 As String
Dim h2a2 As String
Dim h0ax(2) As Single
2015年 7月 21日
22
Dim h0aXX As Single
Dim h2aX As Single
Dim CX As Single
Dim m As Integer
Dim cnt As Integer
'------------------------
C1 = 0
C2 = 0.59
CX = 0.0001
cnt = 0
'-----------------------
L1000:
m = 1
N1 = 0
N2 = 0
h2a1 = ""
h2a2 = ""
'*******************************************
Select Case CX
Case 0 To 0.519
'---------------------------------------
For K = 1 To 7
If K + 1 <= h2a And h2a < K + 2 Then
'--------------------------------
h2aX = h2a - (K + 1)
h2a1 = Str(K + 1)
'--------------------
For I = 1 To 200
AA = Sheets("ゲートの水理計算").Cells(33 + I, 3)
'--------------------------
If Val(Right(AA, 1)) = K + 1 Then
For J = 1 To 40
If Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 4) = "" Then
N1 = J - 1
Exit For
Else
2015年 7月 21日
23
X(J) = Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 4)
Y(J) = Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 5)
End If
Next J
'----------------------------------------------------------------------------
h0ax(m) = Serch_h0aX(N1, X(), Y(), CX, m) 'h2/a(K+1)のときの h0/aの
値
'----------------------------------------------------------------------------
End If
'-------------
If N <> 0 Then
Exit For
End If
Next I
If m = 1 Then
m = 2
N2 = 0
End If
'----------------------------------------
ElseIf h2a < K + 1 Then
'--------------------------------
For I = 1 To 200
AA = Sheets("ゲートの水理計算").Cells(33 + I, 3)
'--------------------------
If Val(Right(AA, 1)) = K + 1 Then
For J = 1 To 40
If Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 4) = "" Then
N2 = J - 1
h2a2 = Str(K + 1)
Exit For
Else
X(J) = Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 4)
Y(J) = Sheets("ゲートの水理計算").Cells(33 + I + J + 1, 5)
End If
Next J
2015年 7月 21日
24
'-------------------------------------------------------------------------------
h0ax(m) = Serch_h0aX(N2, X(), Y(), CX, m) 'h2/a(K+2)のときの h0/a値
'-------------------------------------------------------------------------------
End If
'-------------
If N2 <> 0 Then
Exit For
Else
h2a2 = ""
N2 = 0
End If
Next I
'----------------------------
End If
'-------------------------
If h2a2 <> "" Then
Exit For
End If
'-------------------------
Next K
'---------------------
h0aXX = h2aX * (h0ax(2) - h0ax(1)) + h0ax(1)
Cells(15, 11) = CX
Cells(16, 11) = CX
'----------------------------------
If Abs(h0aXX - h0a) <= 0.001 Then
Sheets("ゲートの水理計算").Select
Cells(15, 10) = h2a1
Cells(16, 10) = h2a2
Cells(15, 11) = CX
Cells(16, 11) = CX
Cells(15, 12) = h0aM(1)
Cells(16, 12) = h0aM(2)
'-----------------
Serch_CX = CX
Exit Function
2015年 7月 21日
25
Else
If h0aXX >= h0a Then
C2 = CX
Else
C1 = CX
End If
'---------
CX = (C1 + C2) / 2
cnt = cnt + 1
'--------------------
If cnt >= 5000 Then
MsgBox "5000回試算しましたが収束しませんでしたので終了します"
End
End If
'-------------------
GoTo L1000
End If
'************************************************************************
Case 0.5191 To 0.554
'h2/a >= 2 and h2/a < 3 , h0/a >=2.642 and h0/a < 5.377
'与えられた C1 から自由流出と潜り流出の境界線上の h2/aと h0/aの値を求める
'h2/a1=X h0/a1 , h0/a2=
Call Calc_h0a(CX, h2a, 3, h0a, 15, 46)
Case 0.5541 To 0.573
'h2/a >= 3 and h2/a < 4 , h0/a >=5.378 and h0/a < 8.768
Call Calc_h0a(CX, h2a, 4, h0a, 21, 64)
Case 0.5731 To 0.585
'h2/a >= 4 and h2/a < 5 , h0/a >=8.769 and h0/a < 13.152
Call Calc_h0a(CX, h2a, 5, h0a, 26, 88)
Case 0.5291 To 0.585
'h2/a >= 5 and h2/a < 6 , h0/a >=13.153 and h0/a < 16.000
'C1 >= 0.529 and C1 <= 0.585
Case 0.4921 To 0.529
2015年 7月 21日
26
'h2/a >= 5 and h2/a < 6 , h0/a >=13.153 and h0/a < 16.000
'C1 >= 0.492 and C1 <= 0.529
Case 0.456 To 0.492
'h2/a >= 5 and h2/a < 6 , h0/a >=13.153 and h0/a < 16.000
'C1 >= 0.456 and C1 <= 0.492
Case Else
MsgBox "自由流出です"
End
End Select
'************************************************************************
If Hantei <> "Print Out" Then
GoTo L1000
End If
'-----------------
Serch_CX = CX
Exit Function
End Function
Sub Test()
Dim h2a As Double
Dim h0a As Double
'--------------------
Sheets("ゲートの水理計算").Select
h2a = Cells(15, 8)
h0a = Cells(14, 8)
CX = Serch_CX(h2a, h0a)
End
End Sub
Public Function SanjiShiki(Atai As Single)
'C1を仮定し、h2/aの値を近似式(3 次方程式)の解を求める
X1 = 0
X2 = 8
2015年 7月 21日
27
Kai_X = (X1 + X2) / 2
L1000:
KaiX = 0.001 * Kai_X ^ 3 - 0.0168 * Kai_X ^ 2 + 0.0991 * Kai_X + 0.3795
If Abs(KaiX - Atai) > 0.00001 Then
If KaiX >= Atai Then
X2 = Kai_X
Else
X1 = Kai_X
End If
'----------------
Kai_X = (X1 + X2) / 2
GoTo L1000
End If
'----------------
SanjiShiki = Kai_X
End Function
Sub Test1()
Dim Atai As Single
Atai = 0.54
Y = SanjiShiki(Atai)
End
End Sub
Sub Calc_h0a(CX As Single, h2a As Single, h2a2 As Single, h0a As Single, N As Integer, Gyou As
Integer)
Dim X(40) As Single
Dim Y(40) As Single
Dim h0ax(2) As Single
Hantei = ""
h2a1 = SanjiShiki(CX)
h0a1 = 0.0562 * h2a1 ^ 3 - 0.178 * h2a1 ^ 2 + 2.5574 * h2a1 - 2.2108
'-------------------
'C1=CXのときの h0a2(h2/a=4も時)を求める。データ表から内挿によりもとめる
2015年 7月 21日
28
For J = 1 To N
X(J) = Sheets("ゲートの水理計算").Cells(Gyou + J, 4)
Y(J) = Sheets("ゲートの水理計算").Cells(Gyou + J, 5)
Next J
'-------------------------------------------------------------------------------
h0a2 = Serch_h0aX(N, X(), Y(), CX, 2) 'h2/a(K+2)のときの h0/a値
'-------------------------------------------------------------------------------
'h0/aの値が初期条件と一致するまで繰り返す
h0ax(1) = (h0a2 - h0a1) / (h2a2 - h2a1) * (h2a - h2a1) + h0a1
'--------------------------------------
If Abs(h0ax(1) - h0a) > 0.00001 Then
If h0ax(1) >= h0a Then
C2 = CX
Else
C1 = CX
End If
'-----------
CX = (C1 + C2) / 2
cnt = cnt + 1
'--------------------
If cnt >= 5000 Then
MsgBox "5000回試算しましたが収束しませんでしたので終了します"
End
End If
'----------------
Hantei = "Repeat"
Exit Sub
Else
Hantei = "Print Out"
End If
'--------------------
'結果の出力
Sheets("ゲートの水理計算").Select
Cells(15, 10) = h2a1
Cells(16, 10) = h2a2
Cells(15, 11) = CX
2015年 7月 21日
29
Cells(16, 11) = CX
Cells(15, 12) = h0aM(1)
Cells(16, 12) = h0aM(2)
'-----------------
End Sub
2.4.2 Module2
Sub Get_Top_Left(CX As Single, h0ax As Single)
Sheets("ゲートの水理計算").Activate
Top1 = ActiveSheet.Cells(24, 4)
Left1 = ActiveSheet.Cells(24, 5)
Width1 = ActiveSheet.Cells(24, 6)
Height1 = ActiveSheet.Cells(24, 7)
'----------------------------------
Top2 = ActiveSheet.Cells(25, 4)
Left2 = ActiveSheet.Cells(25, 5)
Width2 = ActiveSheet.Cells(25, 6)
Height2 = ActiveSheet.Cells(25, 7)
'-----------------------------------------
'コネクタを X軸、Y軸にセットする
ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Top = Top1
ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Left = Left1
ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Width = Width1
ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Height = Height1
'-----------------------------------------
ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Top = Top2
ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Left = Left2
ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Width = Width2
ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Height = Height2
'---------------------------------------------------------------------
'直線コネクタ 3、6を平行移動させる
Scale_X = Width2 / 16
Scale_Y = Height1 / 0.6
'-----------------------------------------
ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Left = Left1 + Scale_X * h0ax
ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Top = Top2 - Scale_Y * CX
2015年 7月 21日
30
'-----------------------------------------
'直線コネクタ 3、6を平行移動させたときのプロパティを取得し、シートにその値を出力する
Top1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Top
Left1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Left
Width1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Width
Height1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Height
'-----------------------------------------
Top2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Top
Left2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Left
Width2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Width
Height2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Height
'---------------------------------------------------------------------
ActiveSheet.Cells(29, 4) = Top1
ActiveSheet.Cells(29, 5) = Left1
ActiveSheet.Cells(29, 6) = Width1
ActiveSheet.Cells(29, 7) = Height1
'----------------------------------
ActiveSheet.Cells(30, 4) = Top2
ActiveSheet.Cells(30, 5) = Left2
ActiveSheet.Cells(30, 6) = Width2
ActiveSheet.Cells(30, 7) = Height2
'-----------------------------------------
End Sub
Sub Initial_Set_Top_Left()
Sheets("ゲートの水理計算").Activate
'-----------------------------------------
'直線コネクタ 3、6 を X 軸、Y 軸にセットしたときのプロパティを取得し、シートにその値を出力す
る
Top1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Top
Left1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Left
Width1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Width
Height1 = ActiveSheet.Shapes.Range(Array("Straight Connector 3")).Height
'-----------------------------------------
Top2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Top
Left2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Left
2015年 7月 21日
31
Width2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Width
Height2 = ActiveSheet.Shapes.Range(Array("Straight Connector 6")).Height
'---------------------------------------------------------------------
ActiveSheet.Cells(24, 4) = Top1
ActiveSheet.Cells(24, 5) = Left1
ActiveSheet.Cells(24, 6) = Width1
ActiveSheet.Cells(24, 7) = Height1
'----------------------------------
ActiveSheet.Cells(25, 4) = Top2
ActiveSheet.Cells(25, 5) = Left2
ActiveSheet.Cells(25, 6) = Width2
ActiveSheet.Cells(25, 7) = Height2
'-----------------------------------------
End Sub
Sub Test()
Call Module2.Get_Top_Left(0.405, 8)
End
End Sub