119 lines
3.1 KiB
Python
119 lines
3.1 KiB
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from scipy.interpolate import CubicSpline
|
|
|
|
from Kuengjoe_S05_Aufg2 import Kuengjoe_S05_Aufg2
|
|
|
|
|
|
def main():
|
|
time_values_years = np.array(
|
|
[1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010],
|
|
dtype=float,
|
|
)
|
|
|
|
population_values_millions = np.array(
|
|
[75.995, 91.972, 105.711, 123.203, 131.669, 150.697, 179.323, 203.212, 226.505, 249.633, 281.422, 308.745],
|
|
dtype=float,
|
|
)
|
|
|
|
dense_evaluation_time_values = np.linspace(
|
|
time_values_years[0],
|
|
time_values_years[-1],
|
|
1000,
|
|
)
|
|
|
|
# a) Eigene natürliche kubische Spline aus Aufgabe 2
|
|
spline_values_custom_implementation = Kuengjoe_S05_Aufg2(
|
|
time_values_years,
|
|
population_values_millions,
|
|
dense_evaluation_time_values,
|
|
plot_result=False,
|
|
)
|
|
|
|
# b) SciPy CubicSpline mit natürlichen Randbedingungen
|
|
scipy_natural_cubic_spline = CubicSpline(
|
|
time_values_years,
|
|
population_values_millions,
|
|
bc_type="natural",
|
|
)
|
|
spline_values_scipy = scipy_natural_cubic_spline(dense_evaluation_time_values)
|
|
|
|
# c) Polynom 11. Grades mit verschobener Zeitachse
|
|
shifted_time_values_years = time_values_years - 1900.0
|
|
shifted_dense_evaluation_time_values = dense_evaluation_time_values - 1900.0
|
|
|
|
polynomial_degree = 11
|
|
polynomial_coefficients = np.polyfit(
|
|
shifted_time_values_years,
|
|
population_values_millions,
|
|
polynomial_degree,
|
|
)
|
|
polynomial_values_degree_eleven = np.polyval(
|
|
polynomial_coefficients,
|
|
shifted_dense_evaluation_time_values,
|
|
)
|
|
|
|
# Plot
|
|
plt.figure(figsize=(10, 6))
|
|
plt.plot(
|
|
dense_evaluation_time_values,
|
|
spline_values_custom_implementation,
|
|
label="Aufgabe 2: eigene natürliche kubische Spline",
|
|
)
|
|
plt.plot(
|
|
dense_evaluation_time_values,
|
|
spline_values_scipy,
|
|
"--",
|
|
label="SciPy CubicSpline (natural)",
|
|
)
|
|
plt.plot(
|
|
dense_evaluation_time_values,
|
|
polynomial_values_degree_eleven,
|
|
":",
|
|
label="Polynom 11. Grades",
|
|
)
|
|
plt.plot(
|
|
time_values_years,
|
|
population_values_millions,
|
|
"o",
|
|
label="Messdaten",
|
|
)
|
|
|
|
plt.xlabel("Jahr")
|
|
plt.ylabel("Bevölkerung (in Mio.)")
|
|
plt.title("Vergleich der Interpolationen")
|
|
plt.grid(True)
|
|
plt.legend()
|
|
plt.tight_layout()
|
|
plt.show()
|
|
|
|
custom_values_at_nodes = Kuengjoe_S05_Aufg2(
|
|
time_values_years,
|
|
population_values_millions,
|
|
time_values_years,
|
|
plot_result=False,
|
|
)
|
|
scipy_values_at_nodes = scipy_natural_cubic_spline(time_values_years)
|
|
polynomial_values_at_nodes = np.polyval(
|
|
polynomial_coefficients,
|
|
shifted_time_values_years,
|
|
)
|
|
|
|
print("Original data:")
|
|
print(population_values_millions)
|
|
print()
|
|
|
|
print("Custom spline at nodes:")
|
|
print(custom_values_at_nodes)
|
|
print()
|
|
|
|
print("SciPy spline at nodes:")
|
|
print(scipy_values_at_nodes)
|
|
print()
|
|
|
|
print("Degree-11 polynomial at nodes:")
|
|
print(polynomial_values_at_nodes)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |