From 9a40a5113f083a542c99f2c672a9718dd438913e Mon Sep 17 00:00:00 2001 From: Jens Cornelsen <79703163+IB-Cornelsen@users.noreply.github.com> Date: Sat, 11 Jan 2025 20:05:18 +0100 Subject: [PATCH] =?UTF-8?q?Interpolation=20Ausnutzungsgrad,=20Bilanzinnent?= =?UTF-8?q?emperatur,=20Belastungsgrad=20f=C3=BCr=20EFH=20und=20MFH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ergebnisse in Tabelle A12 geschrieben --- .../A12NutzenergiebedarfHeizung.svelte | 212 +++++++++++++----- .../Tabellen/A9Trinkwassererwaermung.svelte | 4 +- .../SanierungsFahrplanBauteilTemplate.svelte | 103 +++++++++ ...echnungNutzenergiebedarfTrinkwarmwasser.ts | 2 +- .../funktionAusnutzungsgrad.ts | 84 +++++++ .../funktionBilanzInnentemperatur.ts | 180 +++++++++++++++ .../funktionMonatlicherBelastungsgrad.ts | 84 ++++++- 7 files changed, 603 insertions(+), 66 deletions(-) create mode 100644 src/lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgrad.ts create mode 100644 src/lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperatur.ts diff --git a/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte b/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte index 83c151b8..658cb5c9 100644 --- a/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte +++ b/src/components/Tabellen/A12NutzenergiebedarfHeizung.svelte @@ -1,17 +1,114 @@ @@ -63,15 +160,14 @@ 31 - {interpolatedValues[1]?.month} + {Math.round(bilanzinnentemperaturen.Januar*1000)/1000} 1,0 - - {interpolatedValues[1]?.interpolatedValue} + {Math.round(belastungsgrade.Januar*1000)/1000} - - + {waermequellensenkenverhaeltnisJanuar} + {Math.round(ausnutzungsgradJanuar*1000)/1000} @@ -79,15 +175,15 @@ 28 - + {Math.round(bilanzinnentemperaturen.Februar*1000)/1000} 1,9 - + {Math.round(belastungsgrade.Februar*1000)/1000} - - + {waermequellensenkenverhaeltnisFebruar} + {Math.round(ausnutzungsgradFebruar*1000)/1000} @@ -95,15 +191,15 @@ 31 - + {Math.round(bilanzinnentemperaturen.März*1000)/1000} 4,7 - + {Math.round(belastungsgrade.März*1000)/1000} - - + {waermequellensenkenverhaeltnisMärz} + {Math.round(ausnutzungsgradMärz*1000)/1000} @@ -111,15 +207,15 @@ 30 - + {Math.round(bilanzinnentemperaturen.April*1000)/1000} 9,2 - + {Math.round(belastungsgrade.April*1000)/1000} - - + {waermequellensenkenverhaeltnisApril} + {Math.round(ausnutzungsgradApril*1000)/1000} @@ -127,15 +223,15 @@ 31 - + {Math.round(bilanzinnentemperaturen.Mai*1000)/1000} 14,1 - + {Math.round(belastungsgrade.Mai*1000)/1000} - - + {waermequellensenkenverhaeltnisMai} + {Math.round(ausnutzungsgradMai*1000)/1000} @@ -143,15 +239,15 @@ 30 - + {Math.round(bilanzinnentemperaturen.Juni*1000)/1000} 16,7 - + {Math.round(belastungsgrade.Juni*1000)/1000} - - + {waermequellensenkenverhaeltnisJuni} + {Math.round(ausnutzungsgradJuni*1000)/1000} @@ -159,15 +255,15 @@ 31 - + {Math.round(bilanzinnentemperaturen.Juli*1000)/1000} 19,0 - + {Math.round(belastungsgrade.Juli*1000)/1000} - - + {waermequellensenkenverhaeltnisJuli} + {Math.round(ausnutzungsgradJuli*1000)/1000} @@ -175,15 +271,15 @@ 31 - + {Math.round(bilanzinnentemperaturen.August*1000)/1000} 18,6 - + {Math.round(belastungsgrade.August*1000)/1000} - - + {waermequellensenkenverhaeltnisAugust} + {Math.round(ausnutzungsgradAugust*1000)/1000} @@ -191,15 +287,15 @@ 30 - + {Math.round(bilanzinnentemperaturen.September*1000)/1000} 14,3 - + {Math.round(belastungsgrade.September*1000)/1000} - - + {waermequellensenkenverhaeltnisSeptember} + {Math.round(ausnutzungsgradSeptember*1000)/1000} @@ -207,15 +303,15 @@ 31 - + {Math.round(bilanzinnentemperaturen.Oktober*1000)/1000} 9,4 - + {Math.round(belastungsgrade.Oktober*1000)/1000} - - + {waermequellensenkenverhaeltnisOktober} + {Math.round(ausnutzungsgradOktober*1000)/1000} @@ -223,15 +319,15 @@ 30 - + {Math.round(bilanzinnentemperaturen.November*1000)/1000} 4,1 - + {Math.round(belastungsgrade.November*1000)/1000} - - + {waermequellensenkenverhaeltnisNovember} + {Math.round(ausnutzungsgradNovember*1000)/1000} @@ -239,15 +335,15 @@ 31 - + {Math.round(bilanzinnentemperaturen.Dezember*1000)/1000} 0,9 - + {Math.round(belastungsgrade.Dezember*1000)/1000} - - + {waermequellensenkenverhaeltnisDezember} + {Math.round(ausnutzungsgradDezember*1000)/1000} diff --git a/src/components/Tabellen/A9Trinkwassererwaermung.svelte b/src/components/Tabellen/A9Trinkwassererwaermung.svelte index 57696a0b..8e5c8660 100644 --- a/src/components/Tabellen/A9Trinkwassererwaermung.svelte +++ b/src/components/Tabellen/A9Trinkwassererwaermung.svelte @@ -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 diff --git a/src/components/design/content/SanierungsFahrplanBauteilTemplate.svelte b/src/components/design/content/SanierungsFahrplanBauteilTemplate.svelte index e69de29b..8845fec6 100644 --- a/src/components/design/content/SanierungsFahrplanBauteilTemplate.svelte +++ b/src/components/design/content/SanierungsFahrplanBauteilTemplate.svelte @@ -0,0 +1,103 @@ +
+
+
Farbklasse
+
+
+
+
+
+
+
+
+
+
U-Wert [W/(m²K)] / Beschreibung
+
≤ 0,12 / Sparrendach geneigt und stark hinterlüftet mit 20cm PUR/PIR-Hartschaum Aufsparrendämmung (hocheffiziente Dämmung mit WLG 0,024)
+
≤ 0,14 / Sparrendach geneigt und stark hinterlüftet mit 18cm PUR/PIR-Hartschaum Aufsparrendämmung (hocheffiziente Dämmung mit WLG 0,024)
+
≤ 0,24 / Sparrendach geneigt und hinterlüftet mit 18cm mineralischer Zwischensparren-
dämmung und 5 cm Untersparrendämmung (Standarddämmung mit WLG 0,04)
+
≤ 0,30 / Sparrendach geneigt und hinterlüftet mit 18cm mineralischer Zwischensparren-
dämmung (Standarddämmung mit WLG 0,04)
+
≤ 0,50 / Sparrendach geneigt und hinterlüftet mit 12cm mineralischer Zwischensparren-
dämmung (Standarddämmung mit WLG 0,04)
+
≤ 0,80 / Sparrendach geneigt und hinterlüftet mit 5cm mineralischer Zwischensparren-
dämmung (Standarddämmung mit WLG 0,04)
+
> 0,80 / Sparrendach geneigt und hinterlüftet ungedämmt oder weniger als 5cm Zwischensparrendämmung (Standarddämmung mit WLG 0,04)
+
+
+ + \ No newline at end of file diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungNutzenergiebedarfTrinkwarmwasser.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungNutzenergiebedarfTrinkwarmwasser.ts index e757d770..10ccb982 100644 --- a/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungNutzenergiebedarfTrinkwarmwasser.ts +++ b/src/lib/Berechnungen/BedarfsausweisWohnen/BerechnungNutzenergiebedarfTrinkwarmwasser.ts @@ -10,7 +10,7 @@ import { linearInterpolation } from "js-interpolate" * @param {BedarfsausweisWohnenClient} ausweis * @param {GebaeudeAufnahmeClient} gebaeude_aufnahme */ -export function berechnungNutzenergiebedarfTrinkwasser(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) { +export function berechnungNutzenergiebedarfTrinkwarmwasser(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) { // A_NGF const bezugsflaeche = gebaeude_aufnahme.nutzflaeche ?? 0; diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgrad.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgrad.ts new file mode 100644 index 00000000..a4cc3b7e --- /dev/null +++ b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgrad.ts @@ -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")) diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperatur.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperatur.ts new file mode 100644 index 00000000..08ebfb37 --- /dev/null +++ b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperatur.ts @@ -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")) \ No newline at end of file diff --git a/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts index 8e4e2d58..297ca56f 100644 --- a/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts +++ b/src/lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.ts @@ -1,9 +1,10 @@ -// 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 } from "js-interpolate"; -// Funktion zur Berechnung des monatlichen Belastungsgrades aus Tabelle 9 EFH (Zeitkonstante 90,130) -const dataset = { +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 ], @@ -66,6 +67,79 @@ const dataset = { }, } +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], + }, +}; + +function getDatasetBelastung(wohneinheiten: number) { + if (wohneinheiten < 3) { + return datasetEinfamilienHausMittlereBelastung; + } else { + return datasetMehrfamilienHausMittlereBelastung; + } +} + +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]; @@ -73,7 +147,7 @@ const HeizLast = [0, 5, 10, 25, 50, 75, 100, 125, 150]; // jede einzeln interpolieren und dann zwischen den Tabellen interpolieren. // Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat: // Januar haben wollen: -function crossInterpolate(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) { +export function funktionMonatlicherBelastungsgrad(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) { const data = dataset[monat] const interpolations: number[] = [] @@ -102,4 +176,4 @@ function crossInterpolate(heizlast: number, zeitkonstane: number, monat: keyof t return interpolate(zeitkonstane) } -console.log(crossInterpolate(120, 100, "Januar")); \ No newline at end of file +console.log(funktionMonatlicherBelastungsgrad(125, 90, "Januar"))