Progressively worse relative size error at smaller absolute sizes I'm having a problem where the relative dimensional error of cylinders is rapidly increasing as the absolute size decreases. Printing a calibration stack of cylinders of diameters 8, 7, 6, 5, 4, and 3 mm, they come out undersized by 5%, 5.3%, 7%, 8%, 10%, and 13%, respectively, as measured by a digital caliper. Cubes exhibit a less severe version of the same pattern: 2.5%, 3%, 5%, 4%, 5%, 7%. The cylinders are generated with OpenSCAD using $fn=180, i.e. they're actually extrusions of 180-gons, so the error should not be caused by poor chord approximation; indeed, measuring projections of the model, or reading the gcode and accounting for nozzle width, everything looks right.

Printer is Ender 3, using PLA at 210. Slicing with CuraEngine.

Could this be caused by underextrusion or print speed issues - or some effect where the material pulls itself together under tight curvature? What techniques might be able to compensate for it, short of fudging the model?

Some additional information: As noted by Trish in the comments, the consistency of the absolute error, which is 0.4 for cylinders and 0.2 for cubes, is likely important. I've also subsequently tested with 110% extrusion rate and the errors for the cylinders dropped to consistently 0.2 mm (still a significant increasing relative error), but the skin layers at the top of the 3 mm cylinder bulged, suggesting the increased extrusion is wrong - an excessive total volume of material.
You should not look at the relative dimensional differences, you should be looking at the absolute differences. Multiplying the undersized dimensions in percentage with the cylinder diameter gives you a value of 0.4 &nbsp;mm for each cylinder give or take a few hundreds. So, basically your printer works very consistent it is just suffering from a systematic offset.

Basically, the printing process needs to
adjust the X-Y dimensions to compensate for plastic flow effects. An option or setting in Ultimaker Cura to counteract this is called Horizontal﻿ ﻿Expansio﻿n. Slic3r and Simplify3d have similar settings. In Slic3r it is called XY size compensation.