← All Use Cases
🪓
Box-Behnken Design

Mortise & Tenon Fit

Box-Behnken design to maximize joint strength and minimize assembly difficulty by tuning tenon thickness tolerance, shoulder depth, and glue type viscosity

Summary

This experiment investigates mortise & tenon fit. Box-Behnken design to maximize joint strength and minimize assembly difficulty by tuning tenon thickness tolerance, shoulder depth, and glue type viscosity.

The design varies 3 factors: tolerance mm (mm), ranging from 0.05 to 0.5, shoulder mm (mm), ranging from 3 to 10, and glue viscosity (cP), ranging from 1000 to 8000. The goal is to optimize 2 responses: pull strength kn (kN) (maximize) and assembly score (pts) (maximize). Fixed conditions held constant across all runs include joint type = through_tenon, wood = white_oak.

A Box-Behnken design was chosen because it efficiently fits quadratic models with 3 continuous factors while avoiding extreme corner combinations — requiring only 15 runs instead of the 8 needed for a full factorial at two levels.

Quadratic response surface models were fitted to capture potential curvature and factor interactions. The RSM contour plots below visualize how pairs of factors jointly affect each response.

Key Findings

For pull strength kn, the most influential factors were tolerance mm (47.0%), glue viscosity (34.5%), shoulder mm (18.5%). The best observed value was 5.15 (at tolerance mm = 0.275, shoulder mm = 3, glue viscosity = 1000).

For assembly score, the most influential factors were tolerance mm (44.8%), glue viscosity (37.3%), shoulder mm (17.9%). The best observed value was 7.4 (at tolerance mm = 0.275, shoulder mm = 6.5, glue viscosity = 4500).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
tolerance_mm0.050.5mm
shoulder_mm310mm
glue_viscosity10008000cP

Fixed: joint_type = through_tenon, wood = white_oak

Responses

ResponseDirectionUnit
pull_strength_kn↑ maximizekN
assembly_score↑ maximizepts

Configuration

use_cases/202_mortise_tenon_fit/config.json
{ "metadata": { "name": "Mortise & Tenon Fit", "description": "Box-Behnken design to maximize joint strength and minimize assembly difficulty by tuning tenon thickness tolerance, shoulder depth, and glue type viscosity" }, "factors": [ { "name": "tolerance_mm", "levels": [ "0.05", "0.5" ], "type": "continuous", "unit": "mm" }, { "name": "shoulder_mm", "levels": [ "3", "10" ], "type": "continuous", "unit": "mm" }, { "name": "glue_viscosity", "levels": [ "1000", "8000" ], "type": "continuous", "unit": "cP" } ], "fixed_factors": { "joint_type": "through_tenon", "wood": "white_oak" }, "responses": [ { "name": "pull_strength_kn", "optimize": "maximize", "unit": "kN" }, { "name": "assembly_score", "optimize": "maximize", "unit": "pts" } ], "settings": { "operation": "box_behnken", "test_script": "use_cases/202_mortise_tenon_fit/sim.sh" } }

Experimental Matrix

The Box-Behnken Design produces 15 runs. Each row is one experiment with specific factor settings.

Runtolerance_mmshoulder_mmglue_viscosity
10.27531000
20.2756.54500
30.56.58000
40.56.51000
50.2756.54500
60.2756.54500
70.056.58000
80.534500
90.27538000
100.5104500
110.056.51000
120.275108000
130.0534500
140.05104500
150.275101000

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/202_mortise_tenon_fit/config.json
2

Generate the runner script

Terminal
$ doe generate --config use_cases/202_mortise_tenon_fit/config.json \ --output use_cases/202_mortise_tenon_fit/results/run.sh --seed 42
3

Execute the experiments

Terminal
$ bash use_cases/202_mortise_tenon_fit/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/202_mortise_tenon_fit/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/202_mortise_tenon_fit/config.json
6

Multi-objective optimization

With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.

Terminal
$ doe optimize --config use_cases/202_mortise_tenon_fit/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/202_mortise_tenon_fit/config.json \ --output use_cases/202_mortise_tenon_fit/results/report.html

Features Exercised

FeatureValue
Design typebox_behnken
Factor typescontinuous (all 3)
Arg styledouble-dash
Responses2 (pull_strength_kn ↑, assembly_score ↑)
Total runs15

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: pull_strength_kn

Top factors: tolerance_mm (47.0%), glue_viscosity (34.5%), shoulder_mm (18.5%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
tolerance_mm23.94021.97013.7380.0714
shoulder_mm20.77170.38590.7320.5105
glue_viscosity22.35491.17752.2340.1695
LackofFit62.76830.4614
PureError21.0541
Error83.82240.5270
Total1410.88920.7778

Pareto Chart

Pareto chart for pull_strength_kn

Main Effects Plot

Main effects plot for pull_strength_kn

Normal Probability Plot of Effects

Normal probability plot for pull_strength_kn

Half-Normal Plot of Effects

Half-normal plot for pull_strength_kn

Model Diagnostics

Model diagnostics for pull_strength_kn

Response: assembly_score

Top factors: tolerance_mm (44.8%), glue_viscosity (37.3%), shoulder_mm (17.9%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
tolerance_mm25.27642.638221.9850.0006
shoulder_mm21.18250.59134.9270.0403
glue_viscosity23.69821.849115.4090.0018
LackofFit63.76290.6271
PureError20.2400
Error84.00290.1200
Total1414.16001.0114

Pareto Chart

Pareto chart for assembly_score

Main Effects Plot

Main effects plot for assembly_score

Normal Probability Plot of Effects

Normal probability plot for assembly_score

Half-Normal Plot of Effects

Half-normal plot for assembly_score

Model Diagnostics

Model diagnostics for assembly_score

Response Surface Plots

3D surfaces fitted with quadratic RSM. Red dots are observed data points.

assembly score shoulder mm vs glue viscosity

RSM surface: assembly score shoulder mm vs glue viscosity

assembly score tolerance mm vs glue viscosity

RSM surface: assembly score tolerance mm vs glue viscosity

assembly score tolerance mm vs shoulder mm

RSM surface: assembly score tolerance mm vs shoulder mm

pull strength kn shoulder mm vs glue viscosity

RSM surface: pull strength kn shoulder mm vs glue viscosity

pull strength kn tolerance mm vs glue viscosity

RSM surface: pull strength kn tolerance mm vs glue viscosity

pull strength kn tolerance mm vs shoulder mm

RSM surface: pull strength kn tolerance mm vs shoulder mm

Multi-Objective Optimization

When responses compete, Derringer–Suich desirability finds the best compromise. Each response is scaled to a 0–1 desirability, then combined via a weighted geometric mean.

Overall Desirability
D = 0.6268

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
pull_strength_kn 1.5
0.4653
3.60 0.4653 3.60 kN
assembly_score 1.5
0.8444
7.00 0.8444 7.00 pts

Recommended Settings

FactorValue
tolerance_mm0.5 mm
shoulder_mm10 mm
glue_viscosity4500 cP

Source: from observed run #10

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
assembly_score7.007.40+0.40

Top 3 Runs by Desirability

RunDFactor Settings
#150.5790tolerance_mm=0.275, shoulder_mm=6.5, glue_viscosity=4500
#30.5765tolerance_mm=0.05, shoulder_mm=6.5, glue_viscosity=8000

Model Quality

ResponseType
assembly_score0.7208quadratic

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.6268 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- pull_strength_kn 1.5 0.4653 3.60 kN ↑ assembly_score 1.5 0.8444 7.00 pts ↑ Recommended settings: tolerance_mm = 0.5 mm shoulder_mm = 10 mm glue_viscosity = 4500 cP (from observed run #10) Trade-off summary: pull_strength_kn: 3.60 (best observed: 5.15, sacrifice: +1.55) assembly_score: 7.00 (best observed: 7.40, sacrifice: +0.40) Model quality: pull_strength_kn: R² = 0.7334 (quadratic) assembly_score: R² = 0.7208 (quadratic) Top 3 observed runs by overall desirability: 1. Run #10 (D=0.6268): tolerance_mm=0.5, shoulder_mm=10, glue_viscosity=4500 2. Run #15 (D=0.5790): tolerance_mm=0.275, shoulder_mm=6.5, glue_viscosity=4500 3. Run #3 (D=0.5765): tolerance_mm=0.05, shoulder_mm=6.5, glue_viscosity=8000

Full Analysis Output

doe analyze
=== Main Effects: pull_strength_kn === Factor Effect Std Error % Contribution -------------------------------------------------------------- tolerance_mm 1.2875 0.2277 47.0% glue_viscosity 0.9464 0.2277 34.5% shoulder_mm 0.5079 0.2277 18.5% === ANOVA Table: pull_strength_kn === Source DF SS MS F p-value ----------------------------------------------------------------------------- tolerance_mm 2 3.9402 1.9701 3.738 0.0714 shoulder_mm 2 0.7717 0.3859 0.732 0.5105 glue_viscosity 2 2.3549 1.1775 2.234 0.1695 Lack of Fit 6 2.7683 0.4614 0.875 0.6201 Pure Error 2 1.0541 0.5270 Error 8 3.8224 0.5270 Total 14 10.8892 0.7778 === Summary Statistics: pull_strength_kn === tolerance_mm: Level N Mean Std Min Max ------------------------------------------------------------ 0.05 4 4.4900 0.7877 3.4600 5.1500 0.275 7 3.4371 0.7882 2.3900 4.8200 0.5 4 3.2025 0.6733 2.2700 3.8100 shoulder_mm: Level N Mean Std Min Max ------------------------------------------------------------ 10 4 3.3850 0.1636 3.1800 3.5600 3 4 3.5100 1.2362 2.2700 4.8200 6.5 7 3.8929 0.9533 2.3900 5.1500 glue_viscosity: Level N Mean Std Min Max ------------------------------------------------------------ 1000 4 3.7725 0.9903 2.6600 5.0600 4500 7 3.2686 0.7239 2.2700 4.2900 8000 4 4.2150 0.9033 3.3400 5.1500 === Main Effects: assembly_score === Factor Effect Std Error % Contribution -------------------------------------------------------------- tolerance_mm 1.4393 0.2597 44.8% glue_viscosity 1.1964 0.2597 37.3% shoulder_mm 0.5750 0.2597 17.9% === ANOVA Table: assembly_score === Source DF SS MS F p-value ----------------------------------------------------------------------------- tolerance_mm 2 5.2764 2.6382 21.985 0.0006 shoulder_mm 2 1.1825 0.5913 4.927 0.0403 glue_viscosity 2 3.6982 1.8491 15.409 0.0018 Lack of Fit 6 3.7629 0.6271 5.226 0.1693 Pure Error 2 0.2400 0.1200 Error 8 4.0029 0.1200 Total 14 14.1600 1.0114 === Summary Statistics: assembly_score === tolerance_mm: Level N Mean Std Min Max ------------------------------------------------------------ 0.05 4 5.0750 1.0340 4.1000 6.2000 0.275 7 6.5143 0.8092 4.9000 7.4000 0.5 4 6.0250 0.7632 5.3000 7.1000 shoulder_mm: Level N Mean Std Min Max ------------------------------------------------------------ 10 4 6.2500 0.2887 5.9000 6.6000 3 4 6.2750 1.1786 4.9000 7.4000 6.5 7 5.7000 1.1944 4.1000 7.0000 glue_viscosity: Level N Mean Std Min Max ------------------------------------------------------------ 1000 4 5.9000 1.3736 4.3000 7.4000 4500 7 6.4714 0.5707 5.7000 7.1000 8000 4 5.2750 0.9743 4.1000 6.3000

Optimization Recommendations

doe optimize
=== Optimization: pull_strength_kn === Direction: maximize Best observed run: #14 tolerance_mm = 0.275 shoulder_mm = 3 glue_viscosity = 1000 Value: 5.15 RSM Model (linear, R² = 0.1865, Adj R² = -0.0354): Coefficients: intercept +3.6553 tolerance_mm +0.2225 shoulder_mm -0.4512 glue_viscosity +0.0263 RSM Model (quadratic, R² = 0.5637, Adj R² = -0.2216): Coefficients: intercept +3.0733 tolerance_mm +0.2225 shoulder_mm -0.4512 glue_viscosity +0.0262 tolerance_mm*shoulder_mm +0.0950 tolerance_mm*glue_viscosity +0.6300 shoulder_mm*glue_viscosity +0.1175 tolerance_mm^2 -0.0729 shoulder_mm^2 +0.5396 glue_viscosity^2 +0.6246 Curvature analysis: glue_viscosity coef=+0.6246 convex (has a minimum) shoulder_mm coef=+0.5396 convex (has a minimum) tolerance_mm coef=-0.0729 negligible curvature Notable interactions: tolerance_mm*glue_viscosity coef=+0.6300 (synergistic) Predicted optimum (from linear model, at observed points): tolerance_mm = 0.5 shoulder_mm = 3 glue_viscosity = 4500 Predicted value: 4.3291 Surface optimum (via L-BFGS-B, linear model): tolerance_mm = 0.5 shoulder_mm = 3 glue_viscosity = 8000 Predicted value: 4.3553 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. shoulder_mm (effect: 1.0, contribution: 47.2%) 2. glue_viscosity (effect: 0.6, contribution: 30.7%) 3. tolerance_mm (effect: 0.4, contribution: 22.1%) === Optimization: assembly_score === Direction: maximize Best observed run: #4 tolerance_mm = 0.275 shoulder_mm = 6.5 glue_viscosity = 4500 Value: 7.4 RSM Model (linear, R² = 0.1820, Adj R² = -0.0411): Coefficients: intercept +6.0000 tolerance_mm -0.0125 shoulder_mm +0.5625 glue_viscosity -0.0750 RSM Model (quadratic, R² = 0.6378, Adj R² = -0.0142): Coefficients: intercept +6.7333 tolerance_mm -0.0125 shoulder_mm +0.5625 glue_viscosity -0.0750 tolerance_mm*shoulder_mm -0.1500 tolerance_mm*glue_viscosity -0.6750 shoulder_mm*glue_viscosity +0.1250 tolerance_mm^2 +0.1333 shoulder_mm^2 -0.9667 glue_viscosity^2 -0.5417 Curvature analysis: shoulder_mm coef=-0.9667 concave (has a maximum) glue_viscosity coef=-0.5417 concave (has a maximum) tolerance_mm coef=+0.1333 convex (has a minimum) Notable interactions: tolerance_mm*glue_viscosity coef=-0.6750 (antagonistic) Predicted optimum (from quadratic model, at observed points): tolerance_mm = 0.5 shoulder_mm = 6.5 glue_viscosity = 1000 Predicted value: 7.0625 Surface optimum (via L-BFGS-B, quadratic model): tolerance_mm = 0.05 shoulder_mm = 7.92584 glue_viscosity = 6602.98 Predicted value: 7.2046 Model quality: Moderate fit — use predictions directionally, not precisely. Factor importance: 1. shoulder_mm (effect: 1.5, contribution: 64.9%) 2. glue_viscosity (effect: 0.6, contribution: 24.1%) 3. tolerance_mm (effect: 0.3, contribution: 11.0%)
← Previous: Wood Finish Drying Conditions All Use Cases →