{
const c = 52;
const param0: Omit = {
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);
// [0][0]が両方最小、[0][1]がコンクリート最小、[1][0]が鉄筋最小
const minParams: Omit[][] = [[param0, param0], [param0, param0]];
for (const phi of ([12.7, 15.9, 19.1, 22.2] as SteelDiameter[])) {
// 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) {
for (const n of [3, 4, 5, 6]) {
const param: Omit = {
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;
minParams[0][1] = param;
if (minVs > vs) {
minVs = vs;
minParams[1][1] = param;
minParams[1][0] = param;
}
} else if (minVs > vs) {
minVs = vs;
minParams[1][0] = param;
}
break;
}
}
}
}
}
const view = (p: Omit) => [
{
...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({
head: ["param", "V_c", "V_s", "safe"],
default: view(minParams[0][0]),
minVc: view(minParams[0][1]),
minVs: view(minParams[1][0]),
min: view(minParams[1][1]),
});
}