You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
25 KiB
191 lines
25 KiB
<!DOCTYPE html>
|
|
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Model customization · UnitCommitment.jl</title><meta name="title" content="Model customization · UnitCommitment.jl"/><meta property="og:title" content="Model customization · UnitCommitment.jl"/><meta property="twitter:title" content="Model customization · UnitCommitment.jl"/><meta name="description" content="Documentation for UnitCommitment.jl."/><meta property="og:description" content="Documentation for UnitCommitment.jl."/><meta property="twitter:description" content="Documentation for UnitCommitment.jl."/><script data-outdated-warner src="../../assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="../.."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../../assets/documenter.js"></script><script src="../../search_index.js"></script><script src="../../siteinfo.js"></script><script src="../../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../../assets/themeswap.js"></script><link href="../../assets/custom.css" rel="stylesheet" type="text/css"/></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="../../">UnitCommitment.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="../../">Home</a></li><li><span class="tocitem">Tutorials</span><ul><li><a class="tocitem" href="../usage/">Getting started</a></li><li class="is-active"><a class="tocitem" href>Model customization</a><ul class="internal"><li><a class="tocitem" href="#Selecting-modeling-components"><span>Selecting modeling components</span></a></li><li><a class="tocitem" href="#Accessing-decision-variables"><span>Accessing decision variables</span></a></li><li><a class="tocitem" href="#Modifying-variables-and-constraints"><span>Modifying variables and constraints</span></a></li><li><a class="tocitem" href="#Modeling-new-grid-components"><span>Modeling new grid components</span></a></li></ul></li><li><a class="tocitem" href="../market/">Market clearing and LMPs</a></li><li><a class="tocitem" href="../decomposition/">Decomposition methods</a></li></ul></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="../../guides/problem/">Problem definition</a></li><li><a class="tocitem" href="../../guides/format/">JSON data format</a></li><li><a class="tocitem" href="../../guides/instances/">Benchmark instances</a></li></ul></li><li><a class="tocitem" href="../../api/">API Reference</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Tutorials</a></li><li class="is-active"><a href>Model customization</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Model customization</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://github.com/ANL-CEEESA/UnitCommitment.jl" title="View the repository on GitHub"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">GitHub</span></a><a class="docs-navbar-link" href="https://github.com/ANL-CEEESA/UnitCommitment.jl/blob/dev/docs/src/tutorials/customizing.jl" title="Edit source on GitHub"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Model-customization"><a class="docs-heading-anchor" href="#Model-customization">Model customization</a><a id="Model-customization-1"></a><a class="docs-heading-anchor-permalink" href="#Model-customization" title="Permalink"></a></h1><p>In the previous tutorial, we used UnitCommitment.jl to solve benchmark and user-provided instances using a default mathematical formulation for the problem. In this tutorial, we will explore how to customize this formulation.</p><div class="admonition is-warning"><header class="admonition-header">Warning</header><div class="admonition-body"><p>This tutorial is not required for using UnitCommitment.jl, unless you plan to make changes to the problem formulation. In this page, we assume familiarity with the JuMP modeling language. Please see <a href="https://jump.dev/JuMP.jl/stable/">JuMP's official documentation</a> for resources on getting started with JuMP.</p></div></div><h2 id="Selecting-modeling-components"><a class="docs-heading-anchor" href="#Selecting-modeling-components">Selecting modeling components</a><a id="Selecting-modeling-components-1"></a><a class="docs-heading-anchor-permalink" href="#Selecting-modeling-components" title="Permalink"></a></h2><p>By default, <code>UnitCommitment.build_model</code> uses a formulation that combines modeling components from different publications, and that has been carefully tested, using our own benchmark scripts, to provide good performance across a wide variety of instances. This default formulation is expected to change over time, as new methods are proposed in the literature. You can, however, construct your own formulation, based on the modeling components that you choose, as shown in the next example.</p><p>We start by importing the necessary packages and reading a benchmark instance:</p><pre><code class="language-julia hljs">using HiGHS
|
|
using JuMP
|
|
using UnitCommitment
|
|
|
|
instance = UnitCommitment.read_benchmark("matpower/case14/2017-01-01");</code></pre><p>Next, instead of calling <code>UnitCommitment.build_model</code> with default arguments, we can provide a <code>UnitCommitment.Formulation</code> object, which describes what modeling components to use, and how should they be configured. For a complete list of modeling components available in UnitCommitment.jl, see the <a href="../../api/">API docs</a>.</p><p>In the example below, we switch to piecewise-linear cost modeling as defined in <a href="https://doi.org/10.1109/TPWRS.2017.2783850">KnuOstWat2018</a>, as well as ramping and startup costs formulation as defined in <a href="https://doi.org/10.1109/TPWRS.2013.2251373">MorLatRam2013</a>. In addition, we specify custom cutoffs for the shift factors formulation.</p><pre><code class="language-julia hljs">model = UnitCommitment.build_model(
|
|
instance = instance,
|
|
optimizer = HiGHS.Optimizer,
|
|
formulation = UnitCommitment.Formulation(
|
|
pwl_costs = UnitCommitment.KnuOstWat2018.PwlCosts(),
|
|
ramping = UnitCommitment.MorLatRam2013.Ramping(),
|
|
startup_costs = UnitCommitment.MorLatRam2013.StartupCosts(),
|
|
transmission = UnitCommitment.ShiftFactorsFormulation(
|
|
isf_cutoff = 0.008,
|
|
lodf_cutoff = 0.003,
|
|
),
|
|
),
|
|
);</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi"><span class="sgr36"><span class="sgr1">[ Info: </span></span>Building model...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Building scenario s1 with probability 1.0
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing injection shift factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed ISF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing line outage factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed LODF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Applying PTDF and LODF cutoffs (0.00800, 0.00300)
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Built model in 0.94 seconds</code></pre><h2 id="Accessing-decision-variables"><a class="docs-heading-anchor" href="#Accessing-decision-variables">Accessing decision variables</a><a id="Accessing-decision-variables-1"></a><a class="docs-heading-anchor-permalink" href="#Accessing-decision-variables" title="Permalink"></a></h2><p>In the previous tutorial, we saw how to access the optimal solution through <code>UnitCommitment.solution</code>. While this approach works well for basic usage, it is also possible to get a direct reference to the JuMP decision variables and query their values, as the next example illustrates.</p><p>First, we load a benchmark instance and solve it, as before.</p><pre><code class="language-julia hljs">instance = UnitCommitment.read_benchmark("matpower/case14/2017-01-01");
|
|
model = UnitCommitment.build_model(
|
|
instance=instance,
|
|
optimizer=HiGHS.Optimizer,
|
|
);
|
|
UnitCommitment.optimize!(model)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi"><span class="sgr36"><span class="sgr1">[ Info: </span></span>Building model...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Building scenario s1 with probability 1.0
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing injection shift factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed ISF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing line outage factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed LODF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Applying PTDF and LODF cutoffs (0.00500, 0.00100)
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Built model in 0.01 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Setting MILP time limit to 86399.99 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Solving MILP...
|
|
Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms
|
|
Presolving model
|
|
4382 rows, 2704 cols, 14776 nonzeros
|
|
3279 rows, 2195 cols, 11913 nonzeros
|
|
3160 rows, 2085 cols, 12983 nonzeros
|
|
|
|
Solving MIP model with:
|
|
3160 rows
|
|
2085 cols (865 binary, 0 integer, 0 implied int., 1220 continuous)
|
|
12983 nonzeros
|
|
|
|
Nodes | B&B Tree | Objective Bounds | Dynamic Constraints | Work
|
|
Proc. InQueue | Leaves Expl. | BestBound BestSol Gap | Cuts InLp Confl. | LpIters Time
|
|
|
|
0 0 0 0.00% 1.86264515e-09 inf inf 0 0 0 0 0.1s
|
|
R 0 0 0 0.00% 360642.328869 360642.544974 0.00% 0 0 0 861 0.1s
|
|
|
|
Solving report
|
|
Status Optimal
|
|
Primal bound 360642.544974
|
|
Dual bound 360642.328869
|
|
Gap 6e-05% (tolerance: 0.01%)
|
|
Solution status feasible
|
|
360642.544974 (objective)
|
|
0 (bound viol.)
|
|
0 (int. viol.)
|
|
0 (row viol.)
|
|
Timing 0.10 (total)
|
|
0.06 (presolve)
|
|
0.00 (postsolve)
|
|
Nodes 1
|
|
LP iterations 861 (total)
|
|
0 (strong br.)
|
|
0 (separation)
|
|
0 (heuristics)
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Verifying transmission limits...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Verified transmission limits in 0.57 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>No violations found</code></pre><p>At this point, it is possible to obtain a reference to the decision variables by calling <code>model[:varname][index]</code>. For example, <code>model[:is_on]["g1",1]</code> returns a direct reference to the JuMP variable indicating whether generator named "g1" is on at time 1. For a complete list of decision variables available, and how are they indexed, see the <a href="../../guides/problem/">problem definition</a>.</p><pre><code class="language-julia hljs">@show JuMP.value(model[:is_on]["g1",1])</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">1.0</code></pre><p>To access second-stage decisions, it is necessary to specify the scenario name. UnitCommitment.jl models deterministic instances as a particular case in which there is a single scenario named "s1", so we need to use this key.</p><pre><code class="language-julia hljs">@show JuMP.value(model[:prod_above]["s1", "g1", 1])</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">145.16900936037393</code></pre><h2 id="Modifying-variables-and-constraints"><a class="docs-heading-anchor" href="#Modifying-variables-and-constraints">Modifying variables and constraints</a><a id="Modifying-variables-and-constraints-1"></a><a class="docs-heading-anchor-permalink" href="#Modifying-variables-and-constraints" title="Permalink"></a></h2><p>When testing variations of the unit commitment problem, it is often necessary to modify the objective function, variables and constraints of the formulation. UnitCommitment.jl makes this process relatively easy. The first step is to construct the standard model using <code>UnitCommitment.build_model</code>:</p><pre><code class="language-julia hljs">instance = UnitCommitment.read_benchmark("matpower/case14/2017-01-01");
|
|
model = UnitCommitment.build_model(
|
|
instance=instance,
|
|
optimizer=HiGHS.Optimizer,
|
|
);</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi"><span class="sgr36"><span class="sgr1">[ Info: </span></span>Building model...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Building scenario s1 with probability 1.0
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing injection shift factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed ISF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing line outage factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed LODF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Applying PTDF and LODF cutoffs (0.00500, 0.00100)
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Built model in 0.01 seconds</code></pre><p>Now, before calling <code>UnitCommitment.optimize</code>, we can make any desired changes to the formulation. In the previous section, we saw how to obtain a direct reference to the decision variables. It is possible to modify them by using standard JuMP methods. For example, to fix the commitment status of a particular generator, we can use <code>JuMP.fix</code>:</p><pre><code class="language-julia hljs">JuMP.fix(model[:is_on]["g1",1], 1.0, force=true)</code></pre><p>To modify the cost coefficient of a particular variable, we can use <code>JuMP.set_objective_coefficient</code>:</p><pre><code class="language-julia hljs">JuMP.set_objective_coefficient(
|
|
model,
|
|
model[:switch_on]["g1",1],
|
|
1000.0,
|
|
)</code></pre><p>It is also possible to make changes to the set of constraints. For example, we can add a custom constraint, using the <code>JuMP.@constraint</code> macro:</p><pre><code class="language-julia hljs">@constraint(
|
|
model,
|
|
model[:is_on]["g3",1] + model[:is_on]["g4",1] <= 1,
|
|
);</code></pre><p>We can also remove an existing model constraint using <code>JuMP.delete</code>. See the <a href="../../guides/problem/">problem definition</a> for a list of constraint names and indices.</p><pre><code class="language-julia hljs">JuMP.delete(model, model[:eq_min_uptime]["g1",1])</code></pre><p>After we are done with all changes, we can call <code>UnitCommitment.optimize</code> and extract the optimal solution:</p><pre><code class="language-julia hljs">UnitCommitment.optimize!(model)
|
|
@show UnitCommitment.solution(model)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">OrderedCollections.OrderedDict{Any, Any} with 15 entries:
|
|
"Thermal production (MW)" => OrderedDict("g1"=>[181.92, 172.85, 166.8…
|
|
"Thermal production cost (\$)" => OrderedDict("g1"=>[7241.95, 6839.01, 657…
|
|
"Startup cost (\$)" => OrderedDict("g1"=>[0.0, 0.0, 0.0, 0.0, 0…
|
|
"Is on" => OrderedDict("g1"=>[1.0, 1.0, 1.0, 1.0, 1…
|
|
"Switch on" => OrderedDict("g1"=>[0.0, 0.0, 0.0, 0.0, 0…
|
|
"Switch off" => OrderedDict("g1"=>[0.0, 0.0, 0.0, 0.0, 0…
|
|
"Net injection (MW)" => OrderedDict("b1"=>[181.92, 172.85, 166.8…
|
|
"Load curtail (MW)" => OrderedDict("b1"=>[0.0, 0.0, 0.0, 0.0, 0…
|
|
"Line overflow (MW)" => OrderedDict("l1"=>[0.0, 0.0, 0.0, 0.0, 0…
|
|
"Spinning reserve (MW)" => OrderedDict("r1"=>OrderedDict("g1"=>[4.6…
|
|
"Spinning reserve shortfall (MW)" => OrderedDict("r1"=>[0.0, 0.0, 0.0, 0.0, 0…
|
|
"Up-flexiramp (MW)" => OrderedDict{Any, Any}()
|
|
"Up-flexiramp shortfall (MW)" => OrderedDict{Any, Any}()
|
|
"Down-flexiramp (MW)" => OrderedDict{Any, Any}()
|
|
"Down-flexiramp shortfall (MW)" => OrderedDict{Any, Any}()</code></pre><h2 id="Modeling-new-grid-components"><a class="docs-heading-anchor" href="#Modeling-new-grid-components">Modeling new grid components</a><a id="Modeling-new-grid-components-1"></a><a class="docs-heading-anchor-permalink" href="#Modeling-new-grid-components" title="Permalink"></a></h2><p>In this section we demonstrate how to add a new grid component to a particular bus in the network. This is useful, for example, when developing formulations for a new type of generator, energy storage, or any other grid device. We start by reading the instance data and buliding a standard model:</p><pre><code class="language-julia hljs">instance = UnitCommitment.read_benchmark("matpower/case118/2017-02-01")
|
|
model = UnitCommitment.build_model(
|
|
instance=instance,
|
|
optimizer=HiGHS.Optimizer,
|
|
);</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi"><span class="sgr36"><span class="sgr1">[ Info: </span></span>Building model...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Building scenario s1 with probability 1.0
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing injection shift factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed ISF in 0.25 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computing line outage factors...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Computed LODF in 0.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Applying PTDF and LODF cutoffs (0.00500, 0.00100)
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Built model in 0.46 seconds</code></pre><p>Next, we create decision variables for the new grid component. In this example, we assume that the new component can inject up to 10 MW of power at each time step, so we create new continuous variables <span>$0 \leq x_t \leq 10$</span>.</p><pre><code class="language-julia hljs">T = instance.time
|
|
@variable(model, x[1:T], lower_bound=0.0, upper_bound=10.0);</code></pre><p>Next, we add the production costs to the objective function. In this example, we assume a generation cost of <span>$</span>5/MW:</p><pre><code class="language-julia hljs">for t in 1:T
|
|
set_objective_coefficient(model, x[t], 5.0)
|
|
end</code></pre><p>We then attach the new component to bus <code>b1</code> by modifying the net injection constraint (<code>eq_net_injection</code>):</p><pre><code class="language-julia hljs">for t in 1:T
|
|
set_normalized_coefficient(
|
|
model[:eq_net_injection]["s1", "b1", t],
|
|
x[t],
|
|
1.0,
|
|
)
|
|
end</code></pre><p>Next, we solve the model:</p><pre><code class="language-julia hljs">UnitCommitment.optimize!(model)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi"><span class="sgr36"><span class="sgr1">[ Info: </span></span>Setting MILP time limit to 86400.00 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Solving MILP...
|
|
Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms
|
|
Presolving model
|
|
43013 rows, 28344 cols, 156154 nonzeros
|
|
33218 rows, 24204 cols, 127961 nonzeros
|
|
31173 rows, 21188 cols, 126079 nonzeros
|
|
|
|
Solving MIP model with:
|
|
31173 rows
|
|
21188 cols (9100 binary, 0 integer, 0 implied int., 12088 continuous)
|
|
126079 nonzeros
|
|
|
|
Nodes | B&B Tree | Objective Bounds | Dynamic Constraints | Work
|
|
Proc. InQueue | Leaves Expl. | BestBound BestSol Gap | Cuts InLp Confl. | LpIters Time
|
|
|
|
0 0 0 0.00% -501782.068184 inf inf 0 0 0 0 0.5s
|
|
R 0 0 0 0.00% 5748240.007416 5748250.232723 0.00% 0 0 0 8320 1.0s
|
|
|
|
Solving report
|
|
Status Optimal
|
|
Primal bound 5748250.23272
|
|
Dual bound 5748240.00742
|
|
Gap 0.000178% (tolerance: 0.01%)
|
|
Solution status feasible
|
|
5748250.23272 (objective)
|
|
0 (bound viol.)
|
|
2.22044604925e-15 (int. viol.)
|
|
0 (row viol.)
|
|
Timing 1.04 (total)
|
|
0.39 (presolve)
|
|
0.00 (postsolve)
|
|
Nodes 1
|
|
LP iterations 8320 (total)
|
|
0 (strong br.)
|
|
0 (separation)
|
|
0 (heuristics)
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Verifying transmission limits...
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>Verified transmission limits in 0.01 seconds
|
|
<span class="sgr36"><span class="sgr1">[ Info: </span></span>No violations found</code></pre><p>We then finally extract the optimal value of the <span>$x$</span> variables:</p><pre><code class="language-julia hljs">@show value.(x)</code></pre><pre class="documenter-example-output"><code class="nohighlight hljs ansi">36-element Vector{Float64}:
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
⋮
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0
|
|
10.0</code></pre></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../usage/">« Getting started</a><a class="docs-footer-nextpage" href="../market/">Market clearing and LMPs »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.2.1 on <span class="colophon-date" title="Thursday 9 May 2024 13:50">Thursday 9 May 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|