Merge pull request #278 from IBCornelsen/Jens

Interpolation Ausnutzungsgrad, Bilanzinnentemperatur, Belastungsgrad für EFH und MFH
This commit is contained in:
Jens Cornelsen
2025-01-11 20:10:06 +01:00
committed by GitHub
12 changed files with 724 additions and 328 deletions

View File

@@ -1,17 +1,114 @@
<script lang="ts">
import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types.js";
import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types.js";
import { funktionMonatlicherBelastungsgrad } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad";
import { funktionBilanzInnentemperatur } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperatur";
import { funktionAusnutzungsgrad } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgrad";
export let ausweis: BedarfsausweisWohnenClient;
export let gebaeude_aufnahme: GebaeudeAufnahmeClient;
export let ausweis: BedarfsausweisWohnenClient;
export let gebaeude_aufnahme: GebaeudeAufnahmeClient;
let heizlast = 25;
let zeitkonstante = 110;
let belastungsgrade = {
Januar: 0,
Februar: 0,
März: 0,
April: 0,
Mai: 0,
Juni: 0,
Juli: 0,
August: 0,
September: 0,
Oktober: 0,
November: 0,
Dezember: 0
};
let bilanzinnentemperaturen = {
Januar: 0,
Februar: 0,
März: 0,
April: 0,
Mai: 0,
Juni: 0,
Juli: 0,
August: 0,
September: 0,
Oktober: 0,
November: 0,
Dezember: 0
};
let ausnutzungsgradJanuar = 0;
let ausnutzungsgradFebruar = 0;
let ausnutzungsgradMärz = 0;
let ausnutzungsgradApril = 0;
let ausnutzungsgradMai = 0;
let ausnutzungsgradJuni = 0;
let ausnutzungsgradJuli = 0;
let ausnutzungsgradAugust = 0;
let ausnutzungsgradSeptember = 0;
let ausnutzungsgradOktober = 0;
let ausnutzungsgradNovember = 0;
let ausnutzungsgradDezember = 0;
// Beispielwerte - müssen noch errechnet werden
let waermequellensenkenverhaeltnisJanuar = 0.3;
let waermequellensenkenverhaeltnisFebruar = 0.5;
let waermequellensenkenverhaeltnisMärz = 0.7;
let waermequellensenkenverhaeltnisApril = 0.9;
let waermequellensenkenverhaeltnisMai = 1.1;
let waermequellensenkenverhaeltnisJuni = 1.3;
let waermequellensenkenverhaeltnisJuli = 1.5;
let waermequellensenkenverhaeltnisAugust = 1.7;
let waermequellensenkenverhaeltnisSeptember = 1.3;
let waermequellensenkenverhaeltnisOktober = 1.1;
let waermequellensenkenverhaeltnisNovember = 0.9;
let waermequellensenkenverhaeltnisDezember = 0.6;
import { funktionMonatlicherBelastungsgrad } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.js";
let interpolatedValues: { month: string, interpolatedValue: number }[] = [];
$: {
const result = funktionMonatlicherBelastungsgrad();
interpolatedValues = result;
}
belastungsgrade.Januar = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Januar");
belastungsgrade.Februar = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Februar");
belastungsgrade.März = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "März");
belastungsgrade.April = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "April");
belastungsgrade.Mai = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Mai");
belastungsgrade.Juni = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Juni");
belastungsgrade.Juli = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Juli");
belastungsgrade.August = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "August");
belastungsgrade.September = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "September");
belastungsgrade.Oktober = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Oktober");
belastungsgrade.November = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "November");
belastungsgrade.Dezember = funktionMonatlicherBelastungsgrad(heizlast, zeitkonstante, "Dezember");
bilanzinnentemperaturen.Januar = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Januar");
bilanzinnentemperaturen.Februar = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Februar");
bilanzinnentemperaturen.März = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "März");
bilanzinnentemperaturen.April = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "April");
bilanzinnentemperaturen.Mai = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Mai");
bilanzinnentemperaturen.Juni = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Juni");
bilanzinnentemperaturen.Juli = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Juli");
bilanzinnentemperaturen.August = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "August");
bilanzinnentemperaturen.September = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "September");
bilanzinnentemperaturen.Oktober = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Oktober");
bilanzinnentemperaturen.November = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "November");
bilanzinnentemperaturen.Dezember = funktionBilanzInnentemperatur(heizlast, zeitkonstante, "Dezember");
ausnutzungsgradJanuar = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisJanuar, zeitkonstante, "alleMonate");
ausnutzungsgradFebruar = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisFebruar, zeitkonstante, "alleMonate");
ausnutzungsgradMärz = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisMärz, zeitkonstante, "alleMonate");
ausnutzungsgradApril = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisApril, zeitkonstante, "alleMonate");
ausnutzungsgradMai = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisMai, zeitkonstante, "alleMonate");
ausnutzungsgradJuni = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisJuni, zeitkonstante, "alleMonate");
ausnutzungsgradJuli = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisJuli, zeitkonstante, "alleMonate");
ausnutzungsgradAugust = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisAugust, zeitkonstante, "alleMonate");
ausnutzungsgradSeptember = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisSeptember, zeitkonstante, "alleMonate");
ausnutzungsgradOktober = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisOktober, zeitkonstante, "alleMonate");
ausnutzungsgradNovember = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisNovember, zeitkonstante, "alleMonate");
ausnutzungsgradDezember = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisDezember, zeitkonstante, "alleMonate");
}
</script>
@@ -63,15 +160,14 @@
<tbody>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{interpolatedValues[1]?.month}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Januar*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">1,0</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
{interpolatedValues[1]?.interpolatedValue}
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Januar*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisJanuar}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradJanuar*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -79,15 +175,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">28</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Februar*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">1,9</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Februar*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisFebruar}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradFebruar*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -95,15 +191,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.März*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">4,7</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.März*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisMärz}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradMärz*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -111,15 +207,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.April*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">9,2</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.April*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisApril}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradApril*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -127,15 +223,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Mai*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">14,1</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Mai*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisMai}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradMai*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -143,15 +239,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Juni*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">16,7</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Juni*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisJuni}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradJuni*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -159,15 +255,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Juli*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">19,0</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Juli*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisJuli}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradJuli*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -175,15 +271,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.August*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">18,6</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.August*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisAugust}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradAugust*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -191,15 +287,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.September*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">14,3</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.September*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisSeptember}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradSeptember*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -207,15 +303,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Oktober*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">9,4</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Oktober*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisOktober}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradOktober*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -223,15 +319,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.November*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">4,1</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.November*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisNovember}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradNovember*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
@@ -239,15 +335,15 @@
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(bilanzinnentemperaturen.Dezember*1000)/1000}</td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">0,9</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(belastungsgrade.Dezember*1000)/1000}
</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1">{waermequellensenkenverhaeltnisDezember}</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100">{Math.round(ausnutzungsgradDezember*1000)/1000}</td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>

View File

@@ -4,12 +4,12 @@
export let ausweis: BedarfsausweisWohnenClient;
export let gebaeude_aufnahme: GebaeudeAufnahmeClient;
import { berechnungTrinkwarmwasserWaermebedarf } from "#lib/Berechnungen/BedarfsausweisWohnen/BerechnungTrinkwarmwasser.js";
import { berechnungNutzenergiebedarfTrinkwarmwasser } from "#lib/Berechnungen/BedarfsausweisWohnen/BerechnungNutzenergiebedarfTrinkwarmwasser.js";
let trinkwasserWaermebedarf = 0, flaechenBezogenerWaermebedarf = 0, bezugsflaeche = 0
$: {
const result = berechnungTrinkwarmwasserWaermebedarf(ausweis, gebaeude_aufnahme)
const result = berechnungNutzenergiebedarfTrinkwarmwasser(ausweis, gebaeude_aufnahme)
trinkwasserWaermebedarf = result.trinkwasserWaermebedarf
flaechenBezogenerWaermebedarf = result.flaechenBezogenerWaermebedarf
bezugsflaeche = result.bezugsflaeche

View File

@@ -0,0 +1,103 @@
<div class="bauteilBox">
<div class="farbBox">
<div class="labelBox">Farbklasse</div>
<div class="farbe"><div class="farbBalkenEins"></div></div>
<div class="farbe"><div class="farbBalkenZwei"></div></div>
<div class="farbe"><div class="farbBalkenDrei"></div></div>
<div class="farbe"><div class="farbBalkenVier"></div></div>
<div class="farbe"><div class="farbBalkenFuenf"></div></div>
<div class="farbe"><div class="farbBalkenAcht"></div></div>
<div class="farbe"><div class="farbBalkenNeun"></div></div>
</div>
<div class="inhaltsBox">
<div class="labelBox">U-Wert [W/(m²K)] / Beschreibung</div>
<div class="textZeileEins">≤ 0,12 / Sparrendach geneigt und stark hinterlüftet mit 20cm PUR/PIR-Hartschaum Aufsparrendämmung (hocheffiziente Dämmung mit WLG 0,024)</div>
<div class="textZeileZwei">≤ 0,14 / Sparrendach geneigt und stark hinterlüftet mit 18cm PUR/PIR-Hartschaum Aufsparrendämmung (hocheffiziente Dämmung mit WLG 0,024)</div>
<div class="textZeileDrei">≤ 0,24 / Sparrendach geneigt und hinterlüftet mit 18cm mineralischer Zwischensparren- <br>dämmung und 5 cm Untersparrendämmung (Standarddämmung mit WLG 0,04)</div>
<div class="textZeileVier">≤ 0,30 / Sparrendach geneigt und hinterlüftet mit 18cm mineralischer Zwischensparren- <br>dämmung (Standarddämmung mit WLG 0,04)</div>
<div class="textZeileFuenf">≤ 0,50 / Sparrendach geneigt und hinterlüftet mit 12cm mineralischer Zwischensparren- <br>dämmung (Standarddämmung mit WLG 0,04)</div>
<div class="textZeileAcht">≤ 0,80 / Sparrendach geneigt und hinterlüftet mit 5cm mineralischer Zwischensparren- <br>dämmung (Standarddämmung mit WLG 0,04)</div>
<div class="textZeileNeun">> 0,80 / Sparrendach geneigt und hinterlüftet ungedämmt oder weniger als 5cm Zwischensparrendämmung (Standarddämmung mit WLG 0,04)</div>
</div>
</div>
<style lang="scss">
.bauteilBox {
@apply grid gap-2 items-stretch p-4 mt-8;
grid-template-columns: 1fr 5fr; /* 1/6 for farbBox and 5/6 for inhaltsBox */
}
.farbe {
@apply flex justify-center items-center;
}
.labelBox {
@apply flex justify-start items-center text-lg font-bold;
}
.farbBalkenEins {
@apply flex w-full bg-effizienzFarbe-1 rounded-3xl h-6;
}
.farbBalkenZwei {
@apply flex w-full bg-effizienzFarbe-2 rounded-3xl h-6;
}
.farbBalkenDrei {
@apply flex w-full bg-effizienzFarbe-3 rounded-3xl h-6;
}
.farbBalkenVier {
@apply flex w-full bg-effizienzFarbe-4 rounded-3xl h-6;
}
.farbBalkenFuenf {
@apply flex w-full bg-effizienzFarbe-5 rounded-3xl h-6;
}
.farbBalkenAcht {
@apply flex w-full bg-effizienzFarbe-8 rounded-3xl h-6;
}
.farbBalkenNeun {
@apply flex w-full bg-effizienzFarbe-9 rounded-3xl h-6;
}
.inhaltsBox {
@apply grid grid-rows-8 gap-3 ml-3 pb-3;
}
.farbBox {
@apply grid grid-rows-8 gap-3 pb-3;
}
.textZeileEins {
@apply flex justify-start items-center bg-white p-1 border-effizienzFarbe-1;
}
.textZeileZwei {
@apply flex justify-start items-center bg-white p-1 border-effizienzFarbe-2;
}
.textZeileDrei {
@apply flex justify-start items-center bg-white p-1 border-effizienzFarbe-3;
}
.textZeileVier {
@apply flex justify-start items-center bg-white p-1 border-effizienzFarbe-4;
}
.textZeileFuenf {
@apply flex justify-start items-center bg-white p-1 border-effizienzFarbe-5;
}
.textZeileAcht {
@apply flex justify-start items-center bg-white p-1 border-2 border-effizienzFarbe-8;
}
.textZeileNeun {
@apply flex justify-start items-center bg-white p-1 border-effizienzFarbe-9;
}
</style>

View File

@@ -1,132 +0,0 @@
import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types.js";
/**
* Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH (Zeitkonstante 90,130)
* @see 18599-Tabellenverfahren-Wohngebaeude.pdf
* @export
* @param {BedarfsausweisWohnenClient} ausweis
* @param {GebaeudeAufnahmeClient} gebaeude_aufnahme
*/
export function BerechnungMonatlicherBelastungsgradT9() {
let Zeitkonstante = 40;
let heizlastGebaeude = 5;
type MonthData = {
month: string;
values: number[];
};
// Zeitkonstante bis 50
const datasetZeitkonstante50: MonthData[] = [
{ month: "Januar", values: [0.557, 0.554, 0.550, 0.543, 0.536, 0.533, 0.531, 0.530] },
{ month: "Februar", values: [0.531, 0.527, 0.524, 0.517, 0.510, 0.507, 0.505, 0.504] },
{ month: "März", values: [0.448, 0.445, 0.443, 0.437, 0.431, 0.427, 0.427, 0.426] },
{ month: "April", values: [0.317, 0.314, 0.313, 0.308, 0.305, 0.303, 0.302, 0.301] },
{ month: "Mai", values: [0.173, 0.172, 0.171, 0.169, 0.166, 0.165, 0.165, 0.164] },
{ month: "Juni", values: [0.097, 0.096, 0.096, 0.094, 0.093, 0.092, 0.092, 0.092] },
{ month: "Juli", values: [0.029, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028] },
{ month: "August", values: [0.041, 0.041, 0.041, 0.040, 0.040, 0.040, 0.039, 0.039] },
{ month: "September", values: [0.167, 0.166, 0.165, 0.164, 0.162, 0.161, 0.161, 0.161] },
{ month: "Oktober", values: [0.308, 0.306, 0.304, 0.300, 0.296, 0.293, 0.293, 0.293] },
{ month: "November", values: [0.466, 0.463, 0.460, 0.454, 0.448, 0.445, 0.444, 0.443] },
{ month: "Dezember", values: [0.560, 0.557, 0.553, 0.546, 0.539, 0.536, 0.534, 0.533] }
];
// Zeitkonstante 90
const datasetZeitkonstante90: MonthData[] = [
{ month: "Januar", values: [0.562, 0.559, 0.555, 0.548, 0.541, 0.538, 0.536, 0.535] },
{ month: "Februar", values: [0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.510, 0.510] },
{ month: "März", values: [0.453, 0.450, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431] },
{ month: "April", values: [0.320, 0.318, 0.316, 0.311, 0.307, 0.306, 0.305, 0.304] },
{ month: "Mai", values: [0.175, 0.173, 0.172, 0.170, 0.168, 0.167, 0.166, 0.166] },
{ month: "Juni", values: [0.098, 0.097, 0.096, 0.095, 0.094, 0.093, 0.093, 0.093] },
{ month: "Juli", values: [0.030, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028] },
{ month: "August", values: [0.041, 0.041, 0.041, 0.040, 0.040, 0.040, 0.040, 0.040] },
{ month: "September", values: [0.169, 0.168, 0.167, 0.164, 0.162, 0.161, 0.161, 0.161] },
{ month: "Oktober", values: [0.311, 0.309, 0.307, 0.303, 0.299, 0.297, 0.296, 0.296] },
{ month: "November", values: [0.471, 0.467, 0.465, 0.459, 0.453, 0.450, 0.448, 0.448] },
{ month: "Dezember", values: [0.565, 0.562, 0.558, 0.551, 0.544, 0.540, 0.539, 0.538] }
];
// Zeitkonstante größer oder gleich 130
const datasetZeitkonstante130: MonthData[] = [
{ month: "Januar", values: [0.567, 0.563, 0.560, 0.553, 0.545, 0.542, 0.540, 0.539, 0.539] },
{ month: "Februar", values: [0.540, 0.537, 0.533, 0.526, 0.520, 0.516, 0.515, 0.514, 0.513] },
{ month: "März", values: [0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434] },
{ month: "April", values: [0.322, 0.320, 0.318, 0.314, 0.310, 0.308, 0.307, 0.307, 0.306] },
{ month: "Mai", values: [0.176, 0.175, 0.174, 0.172, 0.169, 0.168, 0.168, 0.168, 0.167] },
{ month: "Juni", values: [0.098, 0.097, 0.096, 0.095, 0.094, 0.094, 0.094, 0.094, 0.094] },
{ month: "Juli", values: [0.030, 0.030, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028] },
{ month: "August", values: [0.042, 0.041, 0.041, 0.040, 0.040, 0.040, 0.040, 0.040, 0.040] },
{ month: "September", values: [0.170, 0.169, 0.168, 0.166, 0.164, 0.163, 0.162, 0.162, 0.162] },
{ month: "Oktober", values: [0.313, 0.311, 0.309, 0.305, 0.301, 0.300, 0.299, 0.298, 0.298] },
{ month: "November", values: [0.474, 0.471, 0.469, 0.462, 0.456, 0.454, 0.453, 0.451, 0.451] },
{ month: "Dezember", values: [0.570, 0.566, 0.563, 0.555, 0.548, 0.545, 0.543, 0.542, 0.542] },
];
// Für "Ohne Teilbeheizung" habe ich hier einfach 0 genommen. Prakmatisch würde ich sagen.
const HeizLastTabelle = [0, 5, 10, 25, 50, 75, 100, 125, 150];
/**
* Linearly interpolates a value for the given x.
* @param x The x value to interpolate.
* @param xValues The array of x-values.
* @param yValues The array of y-values corresponding to x-values.
* @returns The interpolated value.
*/
function interpolate(x: number, xValues: number[], yValues: number[]): number {
if (x <= xValues[0]) return yValues[0];
if (x >= xValues[xValues.length - 1]) return yValues[yValues.length - 1];
for (let i = 0; i < xValues.length - 1; i++) {
if (x >= xValues[i] && x <= xValues[i + 1]) {
const x1 = xValues[i];
const x2 = xValues[i + 1];
const y1 = yValues[i];
const y2 = yValues[i + 1];
return y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);
}
}
throw new Error("Interpolation error: Value is out of bounds.");
}
let interpolatedValues: { month: string, interpolatedValue: number }[] = [];
if (Zeitkonstante < 50) {
interpolatedValues = datasetZeitkonstante50.map(data => ({
month: data.month,
interpolatedValue: interpolate(heizlastGebaeude, HeizLastTabelle, data.values)
}));
} else if (Zeitkonstante < 90) {
interpolatedValues = datasetZeitkonstante50.map((data, index) => {
if (datasetZeitkonstante90[index] && datasetZeitkonstante90[index].values) {
const interpolatedValue = interpolate(Zeitkonstante, [50, 90], [datasetZeitkonstante50[index].values[0], datasetZeitkonstante90[index].values[0]]);
return {
month: data.month,
interpolatedValue: interpolate(heizlastGebaeude, HeizLastTabelle, [data.values[0], interpolatedValue])
};
} else {
throw new Error(`Data for index ${index} is undefined in datasetZeitkonstante90.`);
}
});
} else if (Zeitkonstante < 130) {
interpolatedValues = datasetZeitkonstante90.map((data, index) => {
if (datasetZeitkonstante130[index] && datasetZeitkonstante130[index].values) {
const interpolatedValue = interpolate(Zeitkonstante, [90, 130], [datasetZeitkonstante90[index].values[0], datasetZeitkonstante130[index].values[0]]);
return {
month: data.month,
interpolatedValue: interpolate(heizlastGebaeude, HeizLastTabelle, [data.values[0], interpolatedValue])
};
} else {
throw new Error(`Data for index ${index} is undefined in datasetZeitkonstante130.`);
}
});
} else {
interpolatedValues = datasetZeitkonstante130.map(data => ({
month: data.month,
interpolatedValue: interpolate(heizlastGebaeude, HeizLastTabelle, data.values)
}));
}
return interpolatedValues;
}

View File

@@ -10,8 +10,7 @@ import { linearInterpolation } from "js-interpolate"
* @param {BedarfsausweisWohnenClient} ausweis
* @param {GebaeudeAufnahmeClient} gebaeude_aufnahme
*/
export function berechnungTrinkwarmwasserWaermebedarf(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) {
export function berechnungNutzenergiebedarfTrinkwarmwasser(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) {
// A_NGF
const bezugsflaeche = gebaeude_aufnahme.nutzflaeche ?? 0;

View File

@@ -0,0 +1,28 @@
import { BedarfsausweisWohnenClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { FixedLengthArray } from "./types.js";
export function berechnungRechnerischeLauzeitHeizung(ausweis: VerbrauchsausweisWohnenClient) {
// TODO Tabelle A.12 (Berechnung Nutzenergiebedarf)
const zeitkonstanteHeizung;
const faktorWochenendAbschaltung = 0.042;
const zeitkonstanteRechnerischeLaufzeitEinfamilienhaus: FixedLengthArray<number, 12> = [17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17];
const zeitkonstanteRechnerischeLaufzeitMehrfamilienhaus: FixedLengthArray<number, 12> = [19.86, 18.58, 18.69, 17.25, 17, 17, 17, 17, 17, 17.16, 18.88, 19.9];
let rechnerischeLaufzeiten = new Array(12).fill(0) as unknown as FixedLengthArray<number, 12>
if (ausweis.gebaeude_aufnahme_allgemein.gebaeudetyp === "Einfamilienhaus") {
for (let i = 0; i < 12; i++) {
rechnerischeLaufzeiten[i] = zeitkonstanteHeizung * faktorWochenendAbschaltung * zeitkonstanteRechnerischeLaufzeitEinfamilienhaus[i]
}
} else {
for (let i = 0; i < 12; i++) {
rechnerischeLaufzeiten[i] = zeitkonstanteHeizung * faktorWochenendAbschaltung * zeitkonstanteRechnerischeLaufzeitMehrfamilienhaus[i]
}
}
return {
rechnerischeLaufzeitGesamt: rechnerischeLaufzeiten.reduce((acc, curr) => acc + curr, 0),
rechnerischeLaufzeiten
}
}

View File

@@ -0,0 +1,5 @@
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
export function berechnungWaermequellenAusAnlagentechnikTrinkwasser(ausweis: VerbrauchsausweisWohnenClient) {
}

View File

@@ -0,0 +1,84 @@
// Funktion zur Berechnung des Ausnutzungsgrades aus Tabelle 18
import { nevillePolynomialInterpolation } from "js-interpolate";
let waermequellensenkenverhaeltnis = 3.4; // Beispielwert - muss noch errechnet werden
const dataset = {
alleMonate: {
30: [ 0.999,0.992,0.978,0.956,0.927,0.893,0.856,0.818,0.78,0.742,0.706,0.671,0.638,0.608,0.579,0.553,0.528,0.505
,0.483,0.463,0.445,0.428,0.411,0.396,0.382,0.369,0.357,0.345,0.334,0.324,0.314,0.305,0.296,0.288,0.28,0.273,0.266,
0.259,0.253,0.246,0.22,0.198,0.181,0.166,0.153,0.142,0.133,0.125,0.117,0.111,0.105,0.1],
40: [ 1.0,0.997,0.99,0.975,0.954,0.926,0.892,0.855,0.817,0.778,0.739,0.702,0.667,0.634,0.603,0.574,0.547,0.522
,0.498,0.477,0.457,0.438,0.421,0.405,0.39,0.376,0.363,0.351,0.339,0.329,0.318,0.309,0.3,0.291,0.283,0.276,0.268,
0.261,0.255,0.249,0.221,0.199,0.181,0.166,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
50: [ 1.0,0.999,0.995,0.986,0.97,0.948,0.918,0.883,0.845,0.805,0.765,0.726,0.688,0.652,0.619,0.588,0.559,0.533
,0.508,0.485,0.464,0.445,0.427,0.41,0.394,0.38,0.366,0.354,0.342,0.331,0.321,0.311,0.301,0.293,0.285,0.277,0.269,
0.262,0.256,0.249,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
60: [ 1.0,1.0,0.998,0.992,0.981,0.963,0.937,0.904,0.867,0.826,0.785,0.743,0.704,0.666,0.631,0.598,0.568,0.54
,0.514,0.491,0.469,0.449,0.43,0.413,0.397,0.382,0.368,0.355,0.343,0.332,0.322,0.312,0.302,0.293,0.285,0.277,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
70: [ 1.0,1.0,0.999,0.996,0.988,0.973,0.951,0.921,0.884,0.843,0.8,0.757,0.716,0.676,0.639,0.605,0.574,0.545
,0.518,0.494,0.472,0.451,0.432,0.414,0.398,0.383,0.369,0.356,0.344,0.333,0.322,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
80: [1.0,1.0,0.999,0.998,0.992,0.981,0.962,0.934,0.898,0.857,0.813,0.769,0.725,0.684,0.646,0.61,0.578,0.548
,0.521,0.496,0.473,0.452,0.433,0.415,0.399,0.384,0.37,0.357,0.344,0.333,0.322,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
90: [ 1.0,1.0,1.0,0.999,0.995,0.986,0.97,0.944,0.91,0.869,0.824,0.778,0.733,0.69,0.651,0.614,0.581,0.55
,0.523,0.497,0.474,0.453,0.434,0.416,0.4,0.384,0.37,0.357,0.345,0.333,0.322,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
100: [ 1.0,1.0,1.0,0.999,0.997,0.99,0.976,0.953,0.92,0.879,0.833,0.786,0.739,0.695,0.654,0.617,0.583,0.552
,0.524,0.498,0.475,0.454,0.434,0.416,0.4,0.384,0.37,0.357,0.345,0.333,0.323,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
110: [ 1.0,1.0,1.0,0.999,0.998,0.993,0.981,0.96,0.928,0.887,0.841,0.792,0.744,0.699,0.657,0.619,0.584,0.553
,0.525,0.499,0.475,0.454,0.435,0.417,0.4,0.384,0.37,0.357,0.345,0.333,0.323,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
120: [ 1.0,1.0,1.0,1.0,0.999,0.995,0.985,0.966,0.935,0.895,0.847,0.798,0.748,0.702,0.659,0.621,0.586,0.554
,0.525,0.5,0.476,0.454,0.435,0.417,0.4,0.385,0.37,0.357,0.345,0.333,0.323,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
130: [ 1.0,1.0,1.0,1.0,0.999,0.996,0.988,0.971,0.942,0.901,0.853,0.802,0.752,0.704,0.661,0.622,0.587,0.554
,0.526,0.5,0.476,0.454,0.435,0.417,0.4,0.385,0.37,0.357,0.345,0.333,0.323,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
140: [ 1.0,1.0,1.0,1.0,0.999,0.997,0.991,0.975,0.947,0.907,0.858,0.806,0.755,0.706,0.662,0.623,0.587,0.555
,0.526,0.5,0.476,0.454,0.435,0.417,0.4,0.385,0.37,0.357,0.345,0.333,0.323,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
150: [ 1.0,1.0,1.0,1.0,0.999,0.998,0.992,0.979,0.952,0.912,0.863,0.809,0.757,0.708,0.663,0.623,0.588,0.555
,0.526,0.5,0.476,0.454,0.435,0.417,0.4,0.385,0.37,0.357,0.345,0.333,0.323,0.312,0.303,0.294,0.286,0.278,0.27,
0.263,0.256,0.25,0.222,0.2,0.182,0.167,0.154,0.143,0.133,0.125,0.118,0.111,0.105,0.1],
},
}
const waermeQuellenSenkenVerhaeltnis = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,
1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.5,5,5.5,6,6.5,7,7.5,8,8.5,9,9.5,10];
export function funktionAusnutzungsgrad(waermequellensenkenverhaeltnis: number, zeitkonstane: number, monat: keyof typeof dataset) {
const data = dataset[monat]
const interpolations: number[] = []
for (const key in data) {
const values = data[key as unknown as keyof typeof data]
const interpolate = nevillePolynomialInterpolation(
values.map((value, i) => ({ x: waermeQuellenSenkenVerhaeltnis[i], y: value })),
values.length
)
interpolations.push(interpolate(waermequellensenkenverhaeltnis))
}
const interpolate = nevillePolynomialInterpolation(
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],
y: interpolation
}
}),
interpolations.length
)
return interpolate(zeitkonstane)
}
console.log(funktionAusnutzungsgrad(waermequellensenkenverhaeltnis, 30, "alleMonate"))

View File

@@ -0,0 +1,180 @@
// Funktion zur Berechnung der Bilanzinnentemperatur aus Tabelle 8 EFH oder Tabelle 10 MFH
import { nevillePolynomialInterpolation } from "js-interpolate";
import { any } from "node_modules/cypress/types/bluebird/index.js";
let wohneinheiten = 3;
const datasetEinfamilienHaus = {
Januar: {
50: [18.83, 18.71, 18.61, 18.38, 18.16, 18.05, 17.99, 17.97, 17.95],
90: [18.99, 18.87, 18.77, 18.54, 18.31, 18.20, 18.15, 18.12, 18.11],
130: [19.14, 19.02, 18.92, 18.68, 18.45, 18.34, 18.29, 18.26, 18.25],
},
Februar: {
50: [18.88, 18.76, 18.67, 18.44, 18.23, 18.13, 18.08, 18.05, 18.04],
90: [19.04, 18.93, 18.83, 18.60, 18.39, 18.29, 18.23, 18.21, 18.20],
130: [19.18, 19.07, 18.97, 18.74, 18.53, 18.42, 18.37, 18.34, 18.33],
},
März: {
50: [19.05, 18.95, 18.87, 18.68, 18.50, 18.42, 18.37, 18.35, 18.34],
90: [19.19, 19.09, 19.01, 18.82, 18.64, 18.55, 18.51, 18.49, 18.48],
130: [19.31, 19.21, 19.13, 18.94, 18.75, 18.67, 18.62, 18.60, 18.59],
},
April: {
50: [19.33, 19.26, 19.20, 19.07, 18.94, 18.88, 18.85, 18.84, 18.83],
90: [19.43, 19.36, 19.30, 19.17, 19.04, 18.98, 18.95, 18.93, 18.92],
130: [19.51, 19.44, 19.38, 19.25, 19.12, 19.06, 19.03, 19.01, 19.00],
},
Mai: {
50: [19.63, 19.60, 19.56, 19.49, 19.42, 19.39, 19.37, 19.36, 19.36],
90: [19.69, 19.65, 19.62, 19.55, 19.48, 19.44, 19.42, 19.42, 19.41],
130: [19.73, 19.70, 19.66, 19.59, 19.52, 19.49, 19.47, 19.46, 19.46],
},
Juni: {
50: [19.80, 19.77, 19.76, 19.72, 19.68, 19.66, 19.65, 19.64, 19.64],
90: [19.83, 19.80, 19.79, 19.75, 19.71, 19.69, 19.68, 19.67, 19.67],
130: [19.85, 19.83, 19.81, 19.77, 19.73, 19.71, 19.70, 19.70, 19.70],
},
Juli: {
50: [19.94, 19.93, 19.93, 19.91, 19.90, 19.90, 19.89, 19.89, 19.89],
90: [19.95, 19.94, 19.94, 19.92, 19.91, 19.91, 19.90, 19.90, 19.90],
130: [19.95, 19.95, 19.94, 19.93, 19.92, 19.91, 19.91, 19.91, 19.91],
},
August: {
50: [19.91, 19.90, 19.90, 19.88, 19.86, 19.86, 19.85, 19.85, 19.85],
90: [19.93, 19.92, 19.91, 19.89, 19.88, 19.87, 19.86, 19.86, 19.86],
130: [19.94, 19.93, 19.92, 19.90, 19.89, 19.88, 19.87, 19.87, 19.87],
},
September: {
50: [19.65, 19.61, 19.58, 19.51, 19.44, 19.41, 19.39, 19.39, 19.38],
90: [19.70, 19.66, 19.63, 19.56, 19.49, 19.46, 19.44, 19.44, 19.43],
130: [19.74, 19.71, 19.68, 19.60, 19.54, 19.50, 19.49, 19.48, 19.47],
},
Oktober: {
50: [19.35, 19.28, 19.23, 19.10, 18.97, 18.91, 18.88, 18.87, 18.86],
90: [19.44, 19.38, 19.32, 19.19, 19.07, 19.01, 18.98, 18.96, 18.95],
130: [19.53, 19.46, 19.40, 19.27, 19.15, 19.08, 19.05, 19.04, 19.03],
},
November: {
50: [19.01, 18.91, 18.83, 18.63, 18.45, 18.35, 18.31, 18.29, 18.28],
90: [19.16, 19.06, 18.97, 18.77, 18.59, 18.49, 18.45, 18.43, 18.42],
130: [19.28, 19.18, 19.09, 18.90, 18.71, 18.61, 18.57, 18.55, 18.53],
},
Dezember: {
50: [18.83, 18.71, 18.61, 18.38, 18.15, 18.04, 17.99, 17.96, 17.95],
90: [18.99, 18.87, 18.76, 18.53, 18.30, 18.19, 18.14, 18.11, 18.10],
130: [19.14, 19.02, 18.91, 18.67, 18.45, 18.33, 18.28, 18.25, 18.24],
},
};
const datasetMehrfamilienHaus = {
Januar: {
50: [19.41, 19.37, 19.33, 19.24, 19.16, 19.12, 19.10, 19.09, 19.08],
90: [19.50, 19.45, 19.41, 19.33, 19.24, 19.20, 19.18, 19.17, 19.17],
130: [19.57, 19.53, 19.49, 19.40, 19.32, 19.28, 19.26, 19.25, 19.24],
},
Februar: {
50: [19.44, 19.40, 19.36, 19.28, 19.20, 19.16, 19.14, 19.13, 19.13],
90: [19.52, 19.48, 19.44, 19.36, 19.28, 19.24, 19.22, 19.21, 19.21],
130: [19.59, 19.55, 19.51, 19.43, 19.35, 19.31, 19.29, 19.28, 19.28],
},
März: {
50: [19.53, 19.49, 19.46, 19.39, 19.32, 19.29, 19.27, 19.27, 19.26],
90: [19.60, 19.56, 19.53, 19.46, 19.39, 19.36, 19.34, 19.33, 19.33],
130: [19.66, 19.62, 19.59, 19.52, 19.45, 19.42, 19.40, 19.39, 19.39],
},
April: {
50: [19.66, 19.64, 19.62, 19.57, 19.52, 19.50, 19.49, 19.48, 19.48],
90: [19.71, 19.69, 19.67, 19.62, 19.57, 19.55, 19.54, 19.53, 19.53],
130: [19.76, 19.73, 19.71, 19.66, 19.61, 19.59, 19.58, 19.57, 19.57],
},
Mai: {
50: [19.82, 19.80, 19.79, 19.76, 19.74, 19.73, 19.72, 19.72, 19.72],
90: [19.84, 19.83, 19.82, 19.79, 19.77, 19.75, 19.75, 19.74, 19.74],
130: [19.87, 19.85, 19.84, 19.81, 19.79, 19.78, 19.77, 19.77, 19.76],
},
Juni: {
50: [19.90, 19.89, 19.88, 19.87, 19.85, 19.85, 19.84, 19.84, 19.84],
90: [19.91, 19.91, 19.90, 19.88, 19.87, 19.86, 19.86, 19.86, 19.86],
130: [19.93, 19.92, 19.91, 19.90, 19.88, 19.87, 19.87, 19.87, 19.87],
},
Juli: {
50: [19.97, 19.97, 19.96, 19.96, 19.96, 19.95, 19.95, 19.95, 19.95],
90: [19.97, 19.97, 19.97, 19.96, 19.96, 19.96, 19.96, 19.96, 19.96],
130: [19.98, 19.98, 19.97, 19.97, 19.96, 19.96, 19.96, 19.96, 19.96],
},
August: {
50: [19.96, 19.95, 19.95, 19.94, 19.94, 19.93, 19.93, 19.93, 19.93],
90: [19.96, 19.96, 19.96, 19.95, 19.94, 19.94, 19.94, 19.94, 19.94],
130: [19.97, 19.97, 19.96, 19.96, 19.95, 19.95, 19.95, 19.94, 19.94],
},
September: {
50: [19.82, 19.81, 19.80, 19.77, 19.75, 19.74, 19.73, 19.73, 19.73],
90: [19.85, 19.84, 19.82, 19.80, 19.77, 19.76, 19.76, 19.75, 19.75],
130: [19.87, 19.86, 19.85, 19.82, 19.80, 19.78, 19.78, 19.77, 19.77],
},
Oktober: {
50: [19.67, 19.65, 19.63, 19.58, 19.53, 19.51, 19.50, 19.50, 19.49],
90: [19.72, 19.70, 19.68, 19.63, 19.58, 19.56, 19.55, 19.54, 19.54],
130: [19.76, 19.74, 19.72, 19.67, 19.62, 19.60, 19.59, 19.58, 19.58],
},
November: {
50: [19.51, 19.47, 19.44, 19.36, 19.30, 19.26, 19.25, 19.24, 19.23],
90: [19.58, 19.54, 19.51, 19.44, 19.37, 19.33, 19.32, 19.31, 19.30],
130: [19.64, 19.60, 19.57, 19.50, 19.43, 19.39, 19.38, 19.37, 19.37],
},
Dezember: {
50: [19.41, 19.36, 19.32, 19.24, 19.15, 19.11, 19.09, 19.08, 19.08],
90: [19.49, 19.45, 19.41, 19.32, 19.24, 19.20, 19.18, 19.17, 19.16],
130: [19.57, 19.52, 19.49, 19.40, 19.31, 19.27, 19.25, 19.24, 19.24],
},
};
function getDataset(wohneinheiten: number) {
if (wohneinheiten < 3) {
return datasetEinfamilienHaus;
} else {
return datasetMehrfamilienHaus;
}
}
const dataset = getDataset(wohneinheiten);
// Für "Ohne Teilbeheizung" habe ich hier einfach 0 eingesetzt:
const HeizLast = [0, 5, 10, 25, 50, 75, 100, 125, 150];
// Um über die beiden Tabellen zu interpolieren können wir einfach zuerst über
// jede einzeln interpolieren und dann zwischen den Tabellen interpolieren.
// Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat:
// Januar haben wollen:
export function funktionBilanzInnentemperatur(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) {
const data = dataset[monat]
const interpolations: number[] = []
for (const key in data) {
const values = data[key as unknown as keyof typeof data]
const interpolate = nevillePolynomialInterpolation(
values.map((value, i) => ({ x: HeizLast[i], y: value })),
values.length
)
interpolations.push(interpolate(heizlast))
}
const interpolate = nevillePolynomialInterpolation(
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],
y: interpolation
}
}),
interpolations.length
)
return interpolate(zeitkonstane)
}
console.log(funktionBilanzInnentemperatur(120, 100, "Januar"))

View File

@@ -1,154 +1,179 @@
// Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH (Januar, Zeitkonstante 90)
// Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH und Tabelle 11 MFH
import { nevillePolynomialInterpolation, lagrangeInterpolation } from "js-interpolate";
// Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH (Zeitkonstante 90,130)
import { nevillePolynomialInterpolation } from "js-interpolate";
type MonthData = {
month: string;
values: number[];
let wohneinheiten = 3;
const datasetEinfamilienHausMittlereBelastung = {
Januar: {
50: [ 0.557, 0.554, 0.55, 0.543, 0.536, 0.533, 0.531, 0.53, 0.53 ],
90: [ 0.562, 0.559, 0.555, 0.548, 0.541, 0.538, 0.536, 0.535, 0.535 ],
130: [ 0.567, 0.563, 0.56, 0.553, 0.545, 0.542, 0.54, 0.539, 0.539 ],
},
Februar: {
50: [ 0.531, 0.527, 0.524, 0.517, 0.51, 0.507, 0.505, 0.504, 0.505 ],
90: [ 0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.51, 0.51, 0.509 ],
130: [ 0.54, 0.537, 0.533, 0.526, 0.52, 0.516, 0.515, 0.514, 0.513 ],
},
"März": {
50: [ 0.448, 0.445, 0.443, 0.437, 0.431, 0.427, 0.427, 0.426, 0.426 ],
90: [ 0.453, 0.45, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431, 0.43 ],
130: [ 0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434 ],
},
April: {
50: [ 0.317, 0.314, 0.313, 0.308, 0.305, 0.303, 0.302, 0.301, 0.301 ],
90: [ 0.32, 0.318, 0.316, 0.311, 0.307, 0.306, 0.305, 0.304, 0.304 ],
130: [ 0.322, 0.32, 0.318, 0.314, 0.31, 0.308, 0.307, 0.307, 0.306 ],
},
Mai: {
50: [ 0.173, 0.172, 0.171, 0.169, 0.166, 0.165, 0.165, 0.165, 0.164 ],
90: [ 0.175, 0.173, 0.172, 0.17, 0.168, 0.167, 0.166, 0.166, 0.166 ],
130: [ 0.176, 0.175, 0.174, 0.172, 0.169, 0.168, 0.168, 0.168, 0.167 ],
},
Juni: {
50: [ 0.097, 0.096, 0.096, 0.094, 0.093, 0.092, 0.092, 0.092, 0.092 ],
90: [ 0.098, 0.097, 0.096, 0.095, 0.094, 0.093, 0.093, 0.093, 0.093 ],
130: [ 0.098, 0.097, 0.096, 0.095, 0.094, 0.094, 0.094, 0.094, 0.094 ],
},
Juli: {
50: [ 0.029, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028 ],
90: [ 0.03, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028 ],
130: [ 0.03, 0.03, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028 ],
},
August: {
50: [ 0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039 ],
90: [ 0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039 ],
130: [ 0.042, 0.041, 0.041, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04 ],
},
September: {
50: [ 0.167, 0.166, 0.165, 0.163, 0.161, 0.16, 0.159, 0.159, 0.159 ],
90: [ 0.169, 0.168, 0.167, 0.164, 0.162, 0.161, 0.161, 0.161, 0.16 ],
130: [ 0.17, 0.169, 0.168, 0.166, 0.164, 0.163, 0.162, 0.162, 0.162 ],
},
Oktober: {
50: [ 0.308, 0.306, 0.304, 0.3, 0.296, 0.294, 0.293, 0.293, 0.293 ],
90: [ 0.311, 0.309, 0.307, 0.303, 0.299, 0.297, 0.296, 0.296, 0.295 ],
130: [ 0.313, 0.311, 0.309, 0.305, 0.301, 0.3, 0.299, 0.298, 0.298 ],
},
November: {
50: [ 0.466, 0.463, 0.46, 0.454, 0.448, 0.445, 0.444, 0.443, 0.443 ],
90: [ 0.471, 0.467, 0.465, 0.459, 0.453, 0.45, 0.448, 0.448, 0.447 ],
130: [ 0.474, 0.471, 0.469, 0.462, 0.456, 0.454, 0.453, 0.451, 0.451 ],
},
Dezember: {
50: [ 0.56, 0.557, 0.553, 0.546, 0.539, 0.536, 0.534, 0.533, 0.533 ],
90: [ 0.565, 0.562, 0.558, 0.551, 0.544, 0.54, 0.539, 0.538, 0.537 ],
130: [ 0.57, 0.566, 0.563, 0.555, 0.548, 0.545, 0.543, 0.542, 0.542 ],
},
}
const datasetMehrfamilienHausMittlereBelastung = {
Januar: {
50: [0.575, 0.574, 0.573, 0.570, 0.567, 0.566, 0.566, 0.565, 0.565],
90: [0.578, 0.577, 0.575, 0.573, 0.570, 0.569, 0.568, 0.568, 0.568],
130: [0.580, 0.579, 0.578, 0.575, 0.572, 0.571, 0.571, 0.570, 0.570],
},
Februar: {
50: [0.548, 0.547, 0.546, 0.543, 0.541, 0.539, 0.539, 0.538, 0.538],
90: [0.551, 0.549, 0.548, 0.546, 0.543, 0.542, 0.541, 0.541, 0.541],
130: [0.553, 0.552, 0.550, 0.548, 0.545, 0.544, 0.543, 0.543, 0.543],
},
März: {
50: [0.463, 0.462, 0.461, 0.459, 0.457, 0.456, 0.455, 0.455, 0.455],
90: [0.465, 0.464, 0.463, 0.461, 0.459, 0.458, 0.458, 0.457, 0.457],
130: [0.467, 0.466, 0.465, 0.463, 0.461, 0.460, 0.459, 0.459, 0.459],
},
April: {
50: [0.327, 0.326, 0.326, 0.324, 0.323, 0.322, 0.321, 0.321, 0.321],
90: [0.329, 0.328, 0.327, 0.326, 0.324, 0.323, 0.323, 0.323, 0.323],
130: [0.330, 0.329, 0.328, 0.327, 0.325, 0.325, 0.324, 0.324, 0.324],
},
Mai: {
50: [0.179, 0.178, 0.178, 0.177, 0.176, 0.176, 0.176, 0.176, 0.175],
90: [0.179, 0.179, 0.179, 0.178, 0.177, 0.177, 0.176, 0.176, 0.176],
130: [0.180, 0.180, 0.179, 0.179, 0.178, 0.177, 0.177, 0.177, 0.177],
},
Juni: {
50: [0.100, 0.100, 0.099, 0.099, 0.099, 0.098, 0.098, 0.098, 0.098],
90: [0.100, 0.100, 0.100, 0.099, 0.099, 0.099, 0.099, 0.099, 0.099],
130: [0.101, 0.101, 0.100, 0.100, 0.099, 0.099, 0.099, 0.099, 0.099],
},
Juli: {
50: [0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030],
90: [0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030],
130: [0.031, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030],
},
August: {
50: [0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042],
90: [0.043, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042],
130: [0.043, 0.043, 0.043, 0.042, 0.042, 0.042, 0.042, 0.042, 0.042],
},
September: {
50: [0.173, 0.172, 0.172, 0.171, 0.170, 0.170, 0.170, 0.170, 0.170],
90: [0.173, 0.173, 0.173, 0.172, 0.171, 0.171, 0.170, 0.170, 0.170],
130: [0.174, 0.174, 0.173, 0.173, 0.172, 0.171, 0.171, 0.171, 0.171],
},
Oktober: {
50: [0.318, 0.317, 0.317, 0.315, 0.314, 0.313, 0.313, 0.312, 0.312],
90: [0.319, 0.319, 0.318, 0.317, 0.315, 0.314, 0.314, 0.314, 0.314],
130: [0.321, 0.320, 0.319, 0.318, 0.316, 0.316, 0.315, 0.315, 0.315],
},
November: {
50: [0.481, 0.480, 0.479, 0.477, 0.475, 0.474, 0.473, 0.473, 0.473],
90: [0.484, 0.483, 0.482, 0.479, 0.477, 0.476, 0.476, 0.475, 0.475],
130: [0.486, 0.485, 0.484, 0.481, 0.479, 0.478, 0.477, 0.477, 0.477],
},
Dezember: {
50: [0.578, 0.577, 0.576, 0.573, 0.570, 0.569, 0.569, 0.568, 0.568],
90: [0.581, 0.580, 0.578, 0.576, 0.573, 0.572, 0.571, 0.571, 0.571],
130: [0.583, 0.582, 0.581, 0.578, 0.575, 0.574, 0.574, 0.573, 0.573],
},
};
const datasetZeitkonstante90: MonthData[] = [
{
month: "Januar",
values: [0.562, 0.559, 0.555, 0.548, 0.541, 0.538, 0.536, 0.535, 0.535],
},
{
month: "Februar",
values: [0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.51, 0.51, 0.509],
},
{
month: "März",
values: [0.453, 0.45, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431, 0.43],
},
{
month: "April",
values: [0.32, 0.318, 0.316, 0.311, 0.307, 0.306, 0.305, 0.304, 0.304],
},
{
month: "Mai",
values: [0.175, 0.173, 0.172, 0.17, 0.168, 0.167, 0.166, 0.166, 0.166],
},
{
month: "Juni",
values: [0.098, 0.097, 0.096, 0.095, 0.094, 0.093, 0.093, 0.093, 0.093],
},
{
month: "Juli",
values: [0.03, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028],
},
{
month: "August",
values: [0.041, 0.041, 0.041, 0.04, 0.04, 0.04, 0.039, 0.039, 0.039],
},
{
month: "September",
values: [0.169, 0.168, 0.167, 0.164, 0.162, 0.161, 0.161, 0.161, 0.16],
},
{
month: "Oktober",
values: [0.311, 0.309, 0.307, 0.303, 0.299, 0.297, 0.296, 0.296, 0.295],
},
{
month: "November",
values: [0.471, 0.467, 0.465, 0.459, 0.453, 0.45, 0.448, 0.448, 0.447],
},
{
month: "Dezember",
values: [0.565, 0.562, 0.558, 0.551, 0.544, 0.54, 0.539, 0.538, 0.537],
},
];
function getDatasetBelastung(wohneinheiten: number) {
if (wohneinheiten < 3) {
return datasetEinfamilienHausMittlereBelastung;
} else {
return datasetMehrfamilienHausMittlereBelastung;
}
}
const datasetZeitkonstante130: MonthData[] = [
{
month: "Januar",
values: [0.567, 0.563, 0.56, 0.553, 0.545, 0.542, 0.54, 0.539, 0.539],
},
{
month: "Februar",
values: [0.54, 0.537, 0.533, 0.526, 0.52, 0.516, 0.515, 0.514, 0.513],
},
{
month: "März",
values: [0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434],
},
{
month: "April",
values: [0.322, 0.32, 0.318, 0.314, 0.31, 0.308, 0.307, 0.307, 0.306],
},
{
month: "Mai",
values: [0.176, 0.175, 0.174, 0.172, 0.169, 0.168, 0.168, 0.168, 0.167],
},
{
month: "Juni",
values: [0.098, 0.097, 0.096, 0.095, 0.094, 0.094, 0.094, 0.094, 0.094],
},
{
month: "Juli",
values: [0.03, 0.03, 0.029, 0.029, 0.028, 0.028, 0.028, 0.028, 0.028],
},
{
month: "August",
values: [0.042, 0.041, 0.041, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04],
},
{
month: "September",
values: [0.17, 0.169, 0.168, 0.166, 0.164, 0.163, 0.162, 0.162, 0.162],
},
{
month: "Oktober",
values: [0.313, 0.311, 0.309, 0.305, 0.301, 0.3, 0.299, 0.298, 0.298],
},
{
month: "November",
values: [0.474, 0.471, 0.469, 0.462, 0.456, 0.454, 0.453, 0.451, 0.451],
},
{
month: "Dezember",
values: [0.57, 0.566, 0.563, 0.555, 0.548, 0.545, 0.543, 0.542, 0.542],
},
];
const dataset = getDatasetBelastung(wohneinheiten);
// Für "Ohne Teilbeheizung" habe ich hier einfach 0 eingesetzt:
const HeizLast = [0, 5, 10, 25, 50, 75, 100, 125, 150];
// Um über die beiden Tabellen zu interpolieren können wir einfach zuerst über
// jede einzeln interpolieren und dann zwischen den Tabellen interpolieren.
// Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat:
// Januar haben wollen:
export function funktionMonatlicherBelastungsgrad(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) {
const data = dataset[monat]
const interpolations: number[] = []
// Um über die beiden Tabellen zu interpolieren können wir einfach zuerst über jede einzeln interpolieren und dann zwischen den Tabellen interpolieren.
// Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat: Januar haben wollen:
for (const key in data) {
const values = data[key as unknown as keyof typeof data]
function crossInterpolate(heizlast: number, zeitkonstane: number, monat: string) {
const interpolatedValuesZeitkonstante90 = datasetZeitkonstante90.filter(data => data.month === monat).map((data) => {
const interpolate = nevillePolynomialInterpolation(
data.values.map((value, i) => ({ x: HeizLast[i], y: value })),
data.values.length
);
return interpolate(heizlast)
});
const interpolatedValuesZeitkonstante130 = datasetZeitkonstante130.filter(data => data.month === monat).map((data) => {
const interpolate = nevillePolynomialInterpolation(
data.values.map((value, i) => ({ x: HeizLast[i], y: value })),
data.values.length
);
return interpolate(heizlast)
});
values.map((value, i) => ({ x: HeizLast[i], y: value })),
values.length
)
interpolations.push(interpolate(heizlast))
}
const interpolate = nevillePolynomialInterpolation(
[{
x: 90,
y: interpolatedValuesZeitkonstante90
}, {
x: 130,
y: interpolatedValuesZeitkonstante130
}],
2
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],
y: interpolation
}
}),
interpolations.length
)
return interpolate(zeitkonstane)
}
console.log(crossInterpolate(25, 90, "Januar"));
console.log(funktionMonatlicherBelastungsgrad(125, 90, "Januar"))

View File

@@ -0,0 +1,8 @@
type ArrayLengthMutationKeys = 'splice' | 'push' | 'pop' | 'shift' | 'unshift'
export type FixedLengthArray<T, L extends number, TObj = [T, ...Array<T>]> =
Pick<TObj, Exclude<keyof TObj, ArrayLengthMutationKeys>>
& {
readonly length: L
[ I : number ] : T
[Symbol.iterator]: () => IterableIterator<T>
}