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
- Run confirmation experiments at the predicted optimal settings to validate the model.
- Consider whether any fixed factors should be varied in a future study.
Experimental Setup
Factors
| Factor | Low | High | Unit |
tolerance_mm | 0.05 | 0.5 | mm |
shoulder_mm | 3 | 10 | mm |
glue_viscosity | 1000 | 8000 | cP |
Fixed: joint_type = through_tenon, wood = white_oak
Responses
| Response | Direction | Unit |
pull_strength_kn | ↑ maximize | kN |
assembly_score | ↑ maximize | pts |
Configuration
{
"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.
| Run | tolerance_mm | shoulder_mm | glue_viscosity |
| 1 | 0.275 | 3 | 1000 |
| 2 | 0.275 | 6.5 | 4500 |
| 3 | 0.5 | 6.5 | 8000 |
| 4 | 0.5 | 6.5 | 1000 |
| 5 | 0.275 | 6.5 | 4500 |
| 6 | 0.275 | 6.5 | 4500 |
| 7 | 0.05 | 6.5 | 8000 |
| 8 | 0.5 | 3 | 4500 |
| 9 | 0.275 | 3 | 8000 |
| 10 | 0.5 | 10 | 4500 |
| 11 | 0.05 | 6.5 | 1000 |
| 12 | 0.275 | 10 | 8000 |
| 13 | 0.05 | 3 | 4500 |
| 14 | 0.05 | 10 | 4500 |
| 15 | 0.275 | 10 | 1000 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/202_mortise_tenon_fit/config.json
2
Generate the runner script
$ 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
$ bash use_cases/202_mortise_tenon_fit/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/202_mortise_tenon_fit/config.json
5
Get optimization recommendations
$ 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.
$ doe optimize --config use_cases/202_mortise_tenon_fit/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/202_mortise_tenon_fit/config.json \
--output use_cases/202_mortise_tenon_fit/results/report.html
Features Exercised
| Feature | Value |
| Design type | box_behnken |
| Factor types | continuous (all 3) |
| Arg style | double-dash |
| Responses | 2 (pull_strength_kn ↑, assembly_score ↑) |
| Total runs | 15 |
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
| Source | DF | SS | MS | F | p-value |
| 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 |
| Pure | Error | 2 | 1.0541 | | |
| Error | 8 | 3.8224 | 0.5270 | | |
| Total | 14 | 10.8892 | 0.7778 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response: assembly_score
Top factors: tolerance_mm (44.8%), glue_viscosity (37.3%), shoulder_mm (17.9%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| 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 |
| Pure | Error | 2 | 0.2400 | | |
| Error | 8 | 4.0029 | 0.1200 | | |
| Total | 14 | 14.1600 | 1.0114 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response Surface Plots
3D surfaces fitted with quadratic RSM. Red dots are observed data points.
assembly score shoulder mm vs glue viscosity
assembly score tolerance mm vs glue viscosity
assembly score tolerance mm vs shoulder mm
pull strength kn shoulder mm vs glue viscosity
pull strength kn tolerance mm vs glue viscosity
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
| Response | Weight | Desirability | Predicted | Dir |
pull_strength_kn |
1.5 |
|
3.60 0.4653 3.60 kN |
↑ |
assembly_score |
1.5 |
|
7.00 0.8444 7.00 pts |
↑ |
Recommended Settings
| Factor | Value |
tolerance_mm | 0.5 mm |
shoulder_mm | 10 mm |
glue_viscosity | 4500 cP |
Source: from observed run #10
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
assembly_score | 7.00 | 7.40 | +0.40 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #15 | 0.5790 | tolerance_mm=0.275, shoulder_mm=6.5, glue_viscosity=4500 |
| #3 | 0.5765 | tolerance_mm=0.05, shoulder_mm=6.5, glue_viscosity=8000 |
Model Quality
| Response | R² | Type |
assembly_score | 0.7208 | quadratic |
Full Multi-Objective Output
============================================================
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
=== 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
=== 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%)