Skip to content

Commit 8d7ac56

Browse files
committed
Add default for xferfcn.floating_point_format
1 parent 8101b31 commit 8d7ac56

2 files changed

Lines changed: 41 additions & 10 deletions

File tree

control/tests/xferfcn_test.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import control as ct
1111
from control import StateSpace, TransferFunction, rss, evalfr
1212
from control import ss, ss2tf, tf, tf2ss, zpk
13-
from control import isctime, isdtime, sample_system, defaults
13+
from control import isctime, isdtime, sample_system, defaults, reset_defaults
1414
from control.statesp import _convert_to_statespace
1515
from control.xferfcn import _convert_to_transfer_function
1616
from control.tests.conftest import slycotonly, matrixfilter
@@ -970,6 +970,33 @@ def test_printing_zpk(self, zeros, poles, gain, output):
970970
res = str(G)
971971
assert res == output
972972

973+
@pytest.mark.parametrize(
974+
"zeros, poles, gain, format, output",
975+
[([1], [1 + 1j, 1 - 1j], 1, ".2f",
976+
'\n'
977+
' 1.00\n'
978+
'-------------------------------------\n'
979+
'(s + (1.00-1.41j)) (s + (1.00+1.41j))\n'),
980+
([1], [1 + 1j, 1 - 1j], 1, ".3f",
981+
'\n'
982+
' 1.000\n'
983+
'-----------------------------------------\n'
984+
'(s + (1.000-1.414j)) (s + (1.000+1.414j))\n'),
985+
([1], [1 + 1j, 1 - 1j], 1, ".6g",
986+
'\n'
987+
' 1\n'
988+
'-------------------------------------\n'
989+
'(s + (1-1.41421j)) (s + (1+1.41421j))\n')
990+
])
991+
def test_printing_zpk_format(self, zeros, poles, gain, format, output):
992+
"""Test _tf_polynomial_to_string for constant systems"""
993+
defaults['xferfcn.floating_point_format'] = format
994+
G = tf([1], [1,2,3], display_format='zpk')
995+
res = str(G)
996+
reset_defaults()
997+
998+
assert res == output
999+
9731000
@pytest.mark.parametrize(
9741001
"num, den, output",
9751002
[([[[11], [21]], [[12], [22]]],

control/xferfcn.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@
7171
# Define module default parameter values
7272
_xferfcn_defaults = {
7373
'xferfcn.display_format': 'poly',
74+
'xferfcn.floating_point_format': '.4g'
7475
}
7576

77+
def _float2str(value):
78+
formatter = "{:" + config.defaults.get('xferfcn.floating_point_format', ':.4g') + "}"
79+
return formatter.format(value)
7680

7781
class TransferFunction(LTI):
7882
"""TransferFunction(num, den[, dt])
@@ -1313,7 +1317,7 @@ def _tf_polynomial_to_string(coeffs, var='s'):
13131317
N = len(coeffs) - 1
13141318

13151319
for k in range(len(coeffs)):
1316-
coefstr = '%.4g' % abs(coeffs[k])
1320+
coefstr = _float2str(abs(coeffs[k]))
13171321
power = (N - k)
13181322
if power == 0:
13191323
if coefstr != '0':
@@ -1355,7 +1359,7 @@ def _tf_factorized_polynomial_to_string(roots, gain=1, var='s'):
13551359
"""Convert a factorized polynomial to a string"""
13561360

13571361
if roots.size == 0:
1358-
return f"{gain:.4g}"
1362+
return _float2str(gain)
13591363

13601364
factors = []
13611365
for root in sorted(roots, reverse=True):
@@ -1364,29 +1368,29 @@ def _tf_factorized_polynomial_to_string(roots, gain=1, var='s'):
13641368
factor = f"{var}"
13651369
factors.append(factor)
13661370
elif root > 0:
1367-
factor = f"{var} - {np.abs(root):.4g}"
1371+
factor = f"{var} - {_float2str(np.abs(root))}"
13681372
factors.append(factor)
13691373
else:
1370-
factor = f"{var} + {np.abs(root):.4g}"
1374+
factor = f"{var} + {_float2str(np.abs(root))}"
13711375
factors.append(factor)
13721376
elif np.isreal(root * 1j):
13731377
if root.imag > 0:
1374-
factor = f"{var} - {np.abs(root):.4g}j"
1378+
factor = f"{var} - {_float2str(np.abs(root))}j"
13751379
factors.append(factor)
13761380
else:
1377-
factor = f"{var} + {np.abs(root):.4g}j"
1381+
factor = f"{var} + {_float2str(np.abs(root))}j"
13781382
factors.append(factor)
13791383
else:
13801384
if root.real > 0:
1381-
factor = f"{var} - ({root:.4g})"
1385+
factor = f"{var} - ({_float2str(root)})"
13821386
factors.append(factor)
13831387
else:
1384-
factor = f"{var} + ({-root:.4g})"
1388+
factor = f"{var} + ({_float2str(-root)})"
13851389
factors.append(factor)
13861390

13871391
multiplier = ''
13881392
if round(gain, 4) != 1.0:
1389-
multiplier = f"{gain:.4g} "
1393+
multiplier = _float2str(gain) + " "
13901394

13911395
if len(factors) > 1 or multiplier:
13921396
factors = [f"({factor})" for factor in factors]

0 commit comments

Comments
 (0)