倒立T形擁壁の設計計算プログラム
以下を求めるつもり
鉄筋量最小
経済性を追求する場合
コンクリート量最小
CO2排出量を最小にする場合
バランス
以下の3パターンの最適解を求めた
A. コンクリート使用量が最小
B. 鉄筋使用量が最小
C. コンクリートと鉄筋の両方が可能な限り最小
使用するコンクリートの単位幅体積を$ V_c、鉄筋の単位幅体積を$ V_cとすると求めるパラメータ$ b_2,b_4,h_s,\phi,m,nは
$ P(b_2,b_4,h_s,\phi,m,n)\land Q(b_2,b_4,h_s,\phi,m,n)のもとで
A. $ \argmin V_c
B. $ \argmin V_s
C. どのパラメータの組み合わせで得た$ V_c',V_s'に対しても$ V_c'\ge V_c\lor V_s'\ge V_sとなる$ V_c,V_sのパラメタ
となる。
ここに、
$ P(b_2,b_4,h_s,\phi,m,n):曲げ、剪断、ひび割れすべてに対して安全なら真を返す論理式
$ Q(b_2,b_4,h_s,\phi,m,n):幾何学的制約条件と鉄筋本数の制約条件
以下の式の論理積で構成される
$ b_2\ge b_4
$ b_4\ge 2c+\phi:擁壁幅はどんなに短くても鉄筋のかぶり分は確保する
$ n\le m\le2n
D16なら$ m\le15、D19なら$ m\le10、D22なら$ m\le7
上部鉄筋
配力鉄筋の鉄筋量と鉄筋間隔の比を、主鉄筋のそれの1/6以上にする
$ \frac{126.7}{250}\ge\frac16\frac{A_s}{c_s}\ge\frac16m\frac{A_s}{b}
$ \iff 3040.8{\rm mm^2}\ge mA_s
主鉄筋間隔$ c_sは曲げモーメントが最大、つまり固定端にて$ \min\{2d(x),300{\rm mm}\}以下にする 下部の鉄筋本数は$ \frac{b}{\min\{2d(x),300{\rm mm}\}}>3.3より大きければいい
それ以外は$ \frac{b}{\min\{3d(x),400{\rm mm}\}}>2.5
鉄筋本数の制限は、「2.2.2 鉛直壁の配筋」を参考に作成
$ V_s=\frac{A_s}{b}(mh_s+n(h_1-h_s))+\frac{b}{c_t}A_t
$ V_c=\frac12(b_2+b_4)h_1-V_s
以上の条件のもとで最小値となるパラメタを求めるコードをつくって計算した
QRコードを載せる
解は総当たり法で探索した
$ Pを満たすすべてのパラメータの組み合わせで$ V_c,V_sを計算し、最小値を出したパラメータを探した
パラメタの条件
擁壁幅と鉄筋端は、1cm刻みで変更
鉄筋径はD16,D19,D22のどれかにした
鉄筋端は4mまで延ばせるものとした
結果
https://gyazo.com/a01cf312c5d000ccd6768900bb20920f
table:solved
default 両方min コンクリmin 鉄筋min
hs/m 2.00 2.00 4.00 1.28
b2/m 0.450 0.450 0.360 1.16
b4/m 0.300 0.300 0.120 0.120
phi/mm 19.1 19.1 15.9 15.9
下部鉄筋 4 4 15 4
上部鉄筋 8 8 5 4
Vc/mm2 1680E+3 1680E+3 1068E+3 2876E+3
Vs/mm2 7449 7449 1241E1 3575
以上より、
鉄筋もコンクリートもなるべく減らす場合:①
コンクリートをできるだけ減らす場合:③
鉄筋をできるだけ減らす場合:④
となる
どれを選ぶかは建設プロジェクトで何を求められているかに依る
経済性を優先するなら、④が最適
CO2発生量をおさえたいなら③がいい
計算の確認
code:script.ts_
const param = {
b2: 0.45,
b4: 0.30,
c: 52,
phi: 19.1,
hs: 2,
m: 8,
n: 4,
} as const;
console.table({
x: x(param),
/*As: x(param).map((x) => As({ x, ...param })),
d: x(param).map((x) => d({ x, ...param })),
p: x(param).map((x) => P({ x, ...param })),
Md1: x(param).map((x) => Md1({ x, ...param })),
Md2: x(param).map((x) => Md2({ x, ...param })),
Mud: x(param).map((x) => Mud({ x, ...param })),
*/
F_M1: x(param).map((x) => F_M1({ x, ...param })),
F_M2: x(param).map((x) => F_M2({ x, ...param })),
/*
beta_d: x(param).map((x) => beta_d({ x, ...param })),
beta_p: x(param).map((x) => beta_p({ x, ...param })),
f_vvcd: x(param).map((x) => f_vvcd({ x, ...param })),
Vd1: x(param).map((x) => Vd1({ x, ...param })),
Vd2: x(param).map((x) => Vd2({ x, ...param })),
Vcd: x(param).map((x) => Vcd({ x, ...param })),
*/
F_V1: x(param).map((x) => F_V1({ x, ...param })),
F_V2: x(param).map((x) => F_V2({ x, ...param })),
/*
np: x(param).map((x) => n*P({ x, ...param })),
j: x(param).map((x) => j({ x, ...param })),
sigma_s: x(param).map((x) => sigma_s({ x, ...param })),
cs: x(param).map((x) => cs({ x, ...param })),
w: x(param).map((x) => w({ x, ...param })),
*/
F_w: x(param).map((x) => F_w({ x, ...param })),
isSafe: x(param).map((x) => isSafe({ x, ...param })),
});
条件を満たす$ \phi,c,b_2,b_4,h_s,m,nを求める
$ b_s:=\frac12(b_2-b_4),b_m:=\frac12(b_2+b_4)とし
$ b_m\ge2c+\phi+b_s
$ b_s\ge0
を守って総当り計算する
$ cはとりあえず$ c=52\rm mmのままにする
$ h_sは一番短いのを採用する
簡略化のため$ m=2nとしておく
$ nは下の議論より$ 3本以上とする
上限は6にしておこう
テスト:全ての鉄筋径で確認
code:script.ts_
{
const param = {
b2: 0.45,
b4: 0.30,
c: 52,
hs: 2,
m: 8,
n: 4,
} as const;
console.log(
(phi) =>
x({ phi, ...param }).map(
(x) => isSafe({ x, phi, ...param }) ? "🟩" : "🟥"
)
)
);
}
テスト:擁壁幅も変更する
1cm刻みで変更
すべての検討位置で安全の時🟩を表示する
code:script.ts_
{
const param = {
c: 52,
hs: 2,
m: 8,
n: 4,
} as const;
type Signal = "🟩" | "🟥";
console.log(
(phi) => {
const result: Signal[][] = [];
// 1cm刻みで増やす
for (let bm = Math.ceil((2 * param.c + phi)/10)/100; bm < 0.7; bm += 0.01) {
const row: Signal[] = [];
for (let bs = 0; bs < bm - (2 * param.c + phi)/1000; bs += 0.01) {
const param2: Omit<Param, "x"> = { phi, b2: bm + bs, b4: bm - bs, ...param };
row.push(
x(param2).every(
(x) => isSafe({ x, ...param2 })
) ? "🟩" : "🟥"
);
}
result.push(row);
}
return result;
}
)
);
}
テスト:コンクリートと鉄筋の体積を出す
$ \phiと$ b_mのみを変える
code:script.ts_
{
const param = {
c: 52,
hs: 2,
m: 8,
n: 4,
} as const;
console.log(
(phi) => {
const result: number[] = [];
// 1cm刻みで増やす
for (let bm = Math.ceil((2 * param.c + phi)/10)/100; bm < 0.7; bm += 0.01) {
const param2: Omit<Param, "x"> = { phi, b2: bm, b4: bm, ...param };
result.push(V_c(param2));
}
return result;
}
)
);
}
$ \phiと$ h_sのみを変える
code:script.ts_
{
const param = {
c: 52,
m: 8,
n: 4,
} as const;
console.log(
(phi) => {
const result: number[] = [];
// 1cm刻みで増やす
for (let hs = 1.5; hs <=4.0; hs += 0.01) {
const bm = Math.ceil((2 * param.c + phi)/10)/100;
const param2: Omit<Param, "x"> = { phi, b2: bm, b4: bm, hs, ...param };
result.push(V_s(param2));
}
return result;
}
)
);
}
最適解を探す
擁壁幅と鉄筋径、鉄筋端を変えた場合
計算にやや時間がかかる
code:script.ts_
{
const c = 52;
const param0: Omit<Param, "x"> = {
b2: 0.45,
b4: 0.30,
c,
phi: 19.1,
hs: 2,
m: 8,
n: 4,
};
let minVs = 10**10;
let minVc = 10**10;
// 00が両方最小、01がコンクリート最小、10が鉄筋最小 const minParams: Omit<Param, "x">[][] = param0, param0], [param0, param0;
// 1cm刻みで増やす
for (let bm = Math.ceil((2 * c + phi)/10)/100; bm < 0.7; bm += 0.01) {
// 1cm刻みで増やす
for (let bs = 0; bs < bm - (2 * c + phi)/1000; bs += 0.01) {
// 1cm刻みで増やす
for (let hs = 1.5; hs <=4.0; hs += 0.01) {
const param: Omit<Param, "x"> = {
phi, hs,
b2: bm + bs,
b4: bm - bs,
c,
m: 8,
n: 4,
};
// 一番短いところで確定する
if (!x(param).every((x) => isSafe({ x, ...param }))) continue;
const vs = V_s(param);
const vc = V_c(param);
if (minVc > vc) {
minVc = vc;
if (minVs > vs) {
minVs = vs;
}
} else if (minVs > vs) {
minVs = vs;
}
break;
}
}
}
}
const view = (p: Omit<Param, "x">) => [
p, V_c(p), V_s(p), x(p).every((x) => isSafe({ x, ...p }))
];
console.table({
default: view(minParams00), minVc: view(minParams01), minVs: view(minParams10), });
}
結果
https://gyazo.com/1efd0e1e74de024f5fdaf43bff9bdb65
https://gyazo.com/19f362c4fa61592371016b285253fba7
鉄筋の本数も変えた場合
code:script.ts
{
const c = 52;
const param0: Omit<Param, "x"> = {
b2: 0.45,
b4: 0.30,
c,
phi: 19.1,
hs: 2,
m: 8,
n: 4,
};
let minVs = V_s(param0);
let minVc = V_c(param0);
// 00が両方最小、01がコンクリート最小、10が鉄筋最小 const minParams: Omit<Param, "x">[][] = param0, param0], [param0, param0;
// 1cm刻みで増やす
for (let bm = Math.ceil((2 * c + phi)/10)/100; bm < 0.7; bm += 0.01) {
// 1cm刻みで増やす
for (let bs = 0; bs < bm - (2 * c + phi)/1000; bs += 0.01) {
// 1cm刻みで増やす
for (let hs = 0.5; hs <=4.0; hs += 0.01) {
const param: Omit<Param, "x"> = {
phi, hs,
b2: bm + bs,
b4: bm - bs,
c,
m: 2 * n,
n,
};
// 一番短いところで確定する
if (!x(param).every((x) => isSafe({ x, ...param }))) continue;
const vs = V_s(param);
const vc = V_c(param);
if (minVc > vc) {
minVc = vc;
if (minVs > vs) {
minVs = vs;
}
} else if (minVs > vs) {
minVs = vs;
}
break;
}
}
}
}
}
const view = (p: Omit<Param, "x">) => [
{
...p,
hs: p.hs.toPrecision(3),
b2: p.b2.toPrecision(3),
b4: p.b4.toPrecision(3),
}, V_c(p), V_s(p), x(p).every((x) => isSafe({ x, ...p }))
];
console.table({
default: view(minParams00), minVc: view(minParams01), minVs: view(minParams10), });
}
結果
https://gyazo.com/f99dad3aacfe7eb635e2fb7a37bb60d8
https://gyazo.com/e956ca37ea33e8f1e190aaf9990d6c47
まあ、こんなものかな
この3ケースを選択すればいい
table:最適解
両方min 両方min(D16以上のみ) コンクリmin 鉄筋min 鉄筋min(D16以上のみ)
hs/m 2.1 2.0 4.0 2.62 2.0
b2/m 0.61 0.45 0.28 1.25 1.26
b4/m 0.13 0.30 0.14 0.13 0.12
phi/mm 12.7 15.9 22.2 12.7 15.9
下部鉄筋 12 8 12 6 6
上部鉄筋 6 4 6 3 3
コンクリminのhsは1.9mでも安全
単にコンクリ量を限りなく小さくするために4mにしてあるだけ
table:体積の倍率
コンクリ 鉄筋
両方min 1 1
default 1.012 1.485
コンクリmin 0.557 3.935
鉄筋min 1.869 0.539
コンクリを半分減らすと、鉄筋が4倍必要になる
コンクリを2倍増やすと、鉄筋が半減する
下部鉄筋本数を2倍でなくてもいいようにしたが、結局最適解はすべて$ m=2nになった
コードは戻した
制約条件
擁壁は逆三角形状にしない
$ b_2\ge b_4
擁壁幅は鉄筋のかぶり分は最低限確保する
$ b_4\ge 2c+\phi
主鉄筋間隔$ c_sは曲げモーメントが最大、つまり固定端にて$ \min\{2d(x),300{\rm mm}\}以下にする 下部の鉄筋本数は$ \frac{b}{\min\{2d(x),300{\rm mm}\}}>3.3より大きければいい
それ以外は$ \frac{b}{\min\{3d(x),400{\rm mm}\}}>2.5
配力鉄筋の鉄筋量と鉄筋間隔の比を、主鉄筋のそれの1/6以上にする
$ \frac{126.7}{250}\ge\frac16\frac{A_s}{c_s}\ge\frac16m\frac{A_s}{b}
$ \iff 3040.8{\rm mm^2}\ge mA_s
D16なら15本以下、D19なら10本以下、D22なら7本以下