Skip to content

[bug] Wrong sign parameter cp2_eur_per_mw2 of create_poly_cost for load #2954

@kornerc

Description

@kornerc

Bug report checklis

  • Searched the issues page for similar reports

  • Read the relevant sections of the documentation

  • Browse the tutorials and tests for usefull code snippets and examples of use

  • Reproduced the issue after updating with pip install --upgrade pandapower (or git pull)

  • Tried basic troubleshooting (if a bug/error) like restarting the interpreter and checking the pythonpath

Reproducible Example

import pandapower as pp


def poly_costs(cp1_eur_per_mw: float, cp2_eur_per_mw2: float, load: bool, p_mw: float) -> None:
    element_name = 'load' if load else 'sgen'

    net = pp.create_empty_network()

    b1 = pp.create_bus(net, vn_kv=20.)
    b2 = pp.create_bus(net, vn_kv=20.)
    pp.create_line(net, from_bus=b1, to_bus=b2, length_km=2.5, std_type="NAYY 4x50 SE")
    pp.create_ext_grid(net, bus=b1)

    kwargs = dict(net=net, bus=b2, p_mw=p_mw, min_p_mw=p_mw, max_p_mw=p_mw, min_q_mvar=0., max_q_mvar=0., controllable=True)
    if load:
        flex = pp.create_load(**kwargs)
    else:
        flex = pp.create_sgen(**kwargs)

    pp.create_poly_cost(net, element=flex, et=element_name, cp1_eur_per_mw=cp1_eur_per_mw, cp2_eur_per_mw2=cp2_eur_per_mw2)

    pp.runopp(net)

    print(f"Element: {element_name}")
    print(f"Cost coefficients: (Linear: {net.poly_cost['cp1_eur_per_mw'].values[0]}, Quadratic: {net.poly_cost['cp2_eur_per_mw2'].values[0]})")
    print(f"Power: {(net.res_load if load else net.res_sgen)['p_mw'].values[0]:.1f} MW")
    print(f"Costs: {net.res_cost:.1f} Eur\n")


if __name__ == "__main__":
    poly_costs(load=True, p_mw=1., cp1_eur_per_mw=1, cp2_eur_per_mw2=0)
    poly_costs(load=True, p_mw=1., cp1_eur_per_mw=0, cp2_eur_per_mw2=1)
    poly_costs(load=True, p_mw=1., cp1_eur_per_mw=-1, cp2_eur_per_mw2=0)
    poly_costs(load=True, p_mw=1., cp1_eur_per_mw=0, cp2_eur_per_mw2=-1)
    poly_costs(load=True, p_mw=-1., cp1_eur_per_mw=1, cp2_eur_per_mw2=0)
    poly_costs(load=True, p_mw=-1., cp1_eur_per_mw=0, cp2_eur_per_mw2=1)
    poly_costs(load=True, p_mw=-1., cp1_eur_per_mw=-1, cp2_eur_per_mw2=0)
    poly_costs(load=True, p_mw=-1., cp1_eur_per_mw=0, cp2_eur_per_mw2=-1)

    poly_costs(load=False, p_mw=1., cp1_eur_per_mw=1, cp2_eur_per_mw2=0)
    poly_costs(load=False, p_mw=1., cp1_eur_per_mw=0, cp2_eur_per_mw2=1)
    poly_costs(load=False, p_mw=1., cp1_eur_per_mw=-1, cp2_eur_per_mw2=0)
    poly_costs(load=False, p_mw=1., cp1_eur_per_mw=0, cp2_eur_per_mw2=-1)
    poly_costs(load=False, p_mw=-1., cp1_eur_per_mw=1, cp2_eur_per_mw2=0)
    poly_costs(load=False, p_mw=-1., cp1_eur_per_mw=0, cp2_eur_per_mw2=1)
    poly_costs(load=False, p_mw=-1., cp1_eur_per_mw=-1, cp2_eur_per_mw2=0)
    poly_costs(load=False, p_mw=-1., cp1_eur_per_mw=0, cp2_eur_per_mw2=-1)
Element: load
Cost coefficients: (Linear: 1.0, Quadratic: 0.0)
Power: 1.0 MW
Costs: 1.0 Eur

Element: load
Cost coefficients: (Linear: 0.0, Quadratic: 1.0)
Power: 1.0 MW
Costs: -1.0 Eur

Element: load
Cost coefficients: (Linear: -1.0, Quadratic: 0.0)
Power: 1.0 MW
Costs: -1.0 Eur

Element: load
Cost coefficients: (Linear: 0.0, Quadratic: -1.0)
Power: 1.0 MW
Costs: 1.0 Eur

Element: load
Cost coefficients: (Linear: 1.0, Quadratic: 0.0)
Power: -1.0 MW
Costs: -1.0 Eur

Element: load
Cost coefficients: (Linear: 0.0, Quadratic: 1.0)
Power: -1.0 MW
Costs: -1.0 Eur

Element: load
Cost coefficients: (Linear: -1.0, Quadratic: 0.0)
Power: -1.0 MW
Costs: 1.0 Eur

Element: load
Cost coefficients: (Linear: 0.0, Quadratic: -1.0)
Power: -1.0 MW
Costs: 1.0 Eur

Element: sgen
Cost coefficients: (Linear: 1.0, Quadratic: 0.0)
Power: 1.0 MW
Costs: 1.0 Eur

Element: sgen
Cost coefficients: (Linear: 0.0, Quadratic: 1.0)
Power: 1.0 MW
Costs: 1.0 Eur

Element: sgen
Cost coefficients: (Linear: -1.0, Quadratic: 0.0)
Power: 1.0 MW
Costs: -1.0 Eur

Element: sgen
Cost coefficients: (Linear: 0.0, Quadratic: -1.0)
Power: 1.0 MW
Costs: -1.0 Eur

Element: sgen
Cost coefficients: (Linear: 1.0, Quadratic: 0.0)
Power: -1.0 MW
Costs: -1.0 Eur

Element: sgen
Cost coefficients: (Linear: 0.0, Quadratic: 1.0)
Power: -1.0 MW
Costs: 1.0 Eur

Element: sgen
Cost coefficients: (Linear: -1.0, Quadratic: 0.0)
Power: -1.0 MW
Costs: 1.0 Eur

Element: sgen
Cost coefficients: (Linear: 0.0, Quadratic: -1.0)
Power: -1.0 MW
Costs: -1.0 Eur

Issue Description and Traceback

The parameter cp2_eur_per_mw2 of create_poly_cost seems to have a different sign convention than the parameter cp1_eur_per_mw seems for load.

Element Power (MW) cp1_eur_per_mw cp2_eur_per_mw2 Cost (Eur)
Load 1 0 1 -1
Load 1 0 -1 1
Load -1 0 1 -1
Load -1 0 -1 1

For sgen they are correct.

Element Power (MW) cp1_eur_per_mw cp2_eur_per_mw2 Cost (Eur)
SGen 1 0 1 1
SGen 1 0 -1 -1
SGen -1 0 1 1
SGen -1 0 -1 -1

The parameter cp1_eur_per_mw works as expected.

Element Power (MW) cp1_eur_per_mw cp2_eur_per_mw2 Cost (Eur)
Load 1 1 0 1
Load 1 -1 0 -1
Load -1 1 0 -1
Load -1 -1 0 1
SGen 1 1 0 1
SGen 1 -1 0 -1
SGen -1 1 0 -1
SGen -1 -1 0 1

Expected Behavior

Element Power (MW) cp1_eur_per_mw cp2_eur_per_mw2 Cost (Eur)
Load 1 0 1 1
Load 1 0 -1 -1
Load -1 0 1 1
Load -1 0 -1 -1

Installed Versions

  • python version: 3.13
  • pandapower: 3.4.0
  • pandas version: 2.3.3
  • Operating System name/version: Debian

Label

  • Relevant labels are selected

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions