{ 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]), }); }