NURBS - Freeform telescope

Author: Matteo Taccola

Example of telescope definition based on NURBS freeform surfaces and first optimization

[1]:
import numpy as np
from optiland import optic, analysis, optimization
[2]:
from optiland.geometries import NurbsGeometry
from optiland.coordinate_system import CoordinateSystem
from optiland.materials import IdealMaterial, Material
from optiland.surfaces import Surface

First optical parameters derived from the optimization of an obstructed telescope

[3]:
radius1 = 99.7616
radius2 = 300.247
radius3 = -220.462
conic1 = 3.15161e-06
conic2 = -1.27041e-05
conic3 = -3.57947e-05
[4]:
field_max = 2

Distances between optical elements

[5]:
d12 = 100.0
d23 = 100.0
d3f = 110.0

Mirrors and focal plane tilts

[6]:
rx1 = np.radians(22.5)
drx2 = np.radians(22.5)
drx3 = np.radians(22.5)
rx4 = np.radians(-45)

Dimensions to perform fitting of conic surfaces with NURBS

[7]:
norm_x_1 = 10.
norm_y_1 = 10.
norm_x_2 = 30.
norm_y_2 = 30.
norm_x_3 = 30.
norm_y_3 = 30.
[8]:
nurbs_tel = optic.Optic()
[9]:
material_pre = IdealMaterial(n=1.0)  # air
material_post = IdealMaterial(n=1.0)
[10]:
cs1 = CoordinateSystem(x=0, y=0, z=0, rx=rx1, ry=0, rz=0, reference_cs=None)
y2 = d12*np.sin(2.0*rx1)
z2 = -d12*np.cos(2.0*rx1)
rx2 = 2.0*rx1 + drx2
cs2 = CoordinateSystem(x=0, y=y2, z=z2, rx=rx2, ry=0, rz=0, reference_cs=None)
y3 = y2-d23*np.sin(2.0*(drx2+rx1))
z3 = z2+d23*np.cos(2.0*(drx2+rx1))
rx3 = 2.0*rx1 + 2.0*drx2 + drx3
cs3 = CoordinateSystem(x=0, y=y3, z=z3, rx=rx3, ry=0, rz=0, reference_cs=None)
y4 = y3 + d3f*np.sin(2.0*rx1)
z4 = z3 + d3f*np.cos(2.0*rx1)
[11]:
# if control points are passed radius and conic are ignored. The surface is built as NURBS from control points and weights
nurbs_geo1 = NurbsGeometry(
    coordinate_system=cs1,
    radius = radius1,
    conic=conic1,
    nurbs_norm_x = norm_x_1,
    nurbs_norm_y = norm_y_1,
)
nurbs_geo1.fit_surface()
nurbs_geo2 = NurbsGeometry(
    coordinate_system=cs2,
    radius = radius2,
    conic=conic2,
    nurbs_norm_x = norm_x_2,
    nurbs_norm_y = norm_y_2,
)
nurbs_geo2.fit_surface()
nurbs_geo3 = NurbsGeometry(
    coordinate_system=cs3,
    radius = radius3,
    conic=conic3,
    nurbs_norm_x = norm_x_3,
    nurbs_norm_y = norm_y_3,
)
nurbs_geo3.fit_surface()
[12]:
new_surface1 = Surface(
    geometry=nurbs_geo1,
    material_pre=material_pre,
    material_post=material_post,
    is_stop = True
)
new_surface2 = Surface(
    geometry=nurbs_geo2,
    material_pre=material_pre,
    material_post=material_post,
)
new_surface3 = Surface(
    geometry=nurbs_geo3,
    material_pre=material_pre,
    material_post=material_post,
)

# Set interaction model to reflective for all surfaces
new_surface1.interaction_model.is_reflective = True
new_surface2.interaction_model.is_reflective = True
new_surface3.interaction_model.is_reflective = True
[13]:
# add surfaces
nurbs_tel.surfaces.add(index=0, radius=np.inf, thickness=np.inf)
nurbs_tel.surfaces.add(
    index=1,
    new_surface=new_surface1,
)
nurbs_tel.surfaces.add(
    index=2,
    new_surface=new_surface2,
)
nurbs_tel.surfaces.add(
    index=3,
    new_surface=new_surface3,
)
nurbs_tel.surfaces.add(index=4, y=y4, z=z4, rx=rx4)
[14]:
nurbs_tel.set_aperture(aperture_type='imageFNO', value=5)
[15]:
# add field
field_max = 2.
nurbs_tel.fields.set_type(field_type="angle")
nurbs_tel.fields.add(y=0)
nurbs_tel.fields.add(y=field_max)
nurbs_tel.fields.add(x=-field_max, y=0)
nurbs_tel.fields.add(x=field_max, y=0)

# add wavelength
wave = 0.55
nurbs_tel.wavelengths.add(value=wave, is_primary=True)
[16]:
_ = nurbs_tel.draw()
../../_images/gallery_freeform_nurbs_freeform_telescope_21_0.png
[17]:
spot = analysis.SpotDiagram(nurbs_tel,num_rings=18)
_ = spot.view()
../../_images/gallery_freeform_nurbs_freeform_telescope_22_0.png

Telescope has severe aberrations due to tilts of the optical elements

[18]:
n_control_points_u = nurbs_geo1.P_size_u
n_control_points_v = nurbs_geo1.P_size_v

First optimization trial. The variables are the positions and weigths of the control points and position/tilt of the focal plane

[19]:
problem = optimization.OptimizationProblem()

for field in nurbs_tel.fields.get_field_coords():
    input_data = {
        "optic": nurbs_tel,
        "surface_number": -1,
        "Hx": field[0],
        "Hy": field[1],
        "num_rays": 16,
        "wavelength": wave,
        "distribution": "uniform",
    }
    problem.add_operand(
        operand_type="rms_spot_size",
        target=0,
        weight=1,
        input_data=input_data,
    )
#variables are the coordinates and weights of the control points
for i in range(3):
    for j in range(n_control_points_u):
        for k in range(n_control_points_v):
            problem.add_variable(nurbs_tel, "nurbs_control_point", surface_number=1, coeff_index = [i,j,k], min_val=-100, max_val=100)
            problem.add_variable(nurbs_tel, "nurbs_control_point", surface_number=2, coeff_index = [i,j,k], min_val=-100, max_val=100)
            problem.add_variable(nurbs_tel, "nurbs_control_point", surface_number=3, coeff_index = [i,j,k], min_val=-100, max_val=100)

for j in range(n_control_points_u):
    for k in range(n_control_points_v):
        problem.add_variable(nurbs_tel, "nurbs_weight", surface_number=1, coeff_index = [j,k], min_val=0, max_val=10)
        problem.add_variable(nurbs_tel, "nurbs_weight", surface_number=2, coeff_index = [j,k], min_val=0, max_val=10)
        problem.add_variable(nurbs_tel, "nurbs_weight", surface_number=3, coeff_index = [j,k], min_val=0, max_val=10)

problem.add_variable(
    nurbs_tel,
    "decenter",
    axis="y",
    surface_number=4,
    min_val=y4-5.,
    max_val=y4+5.,
)
problem.add_variable(
    nurbs_tel,
    "decenter",
    axis="z",
    surface_number=4,
    min_val=z4-5.,
    max_val=z4+5.,
)

# tilts
problem.add_variable(
    nurbs_tel,
    "tilt",
    axis="x",
    surface_number=4,
    min_val=rx4-np.radians(5.0),
    max_val=rx4+np.radians(5.0),
)
[20]:
problem.info()
╒════╤════════════════════════╤═══════════════════╕
│    │   Merit Function Value │   Improvement (%) │
╞════╪════════════════════════╪═══════════════════╡
│  0 │                5.77534 │                 0 │
╘════╧════════════════════════╧═══════════════════╛
╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═════════╤═════════╤════════════════╕
│    │ Operand Type   │   Target │ Min. Bound   │ Max. Bound   │   Weight │   Value │   Delta │   Contrib. [%] │
╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═════════╪═════════╪════════════════╡
│  0 │ rms spot size  │        0 │              │              │        1 │   1.224 │   1.224 │          25.92 │
│  1 │ rms spot size  │        0 │              │              │        1 │   1.121 │   1.121 │          21.75 │
│  2 │ rms spot size  │        0 │              │              │        1 │   1.229 │   1.229 │          26.16 │
│  3 │ rms spot size  │        0 │              │              │        1 │   1.229 │   1.229 │          26.16 │
╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═════════╧═════════╧════════════════╛
╒═════╤═════════════════════╤═══════════╤════════════╤══════════════╤══════════════╕
│     │ Variable Type       │   Surface │      Value │   Min. Bound │   Max. Bound │
╞═════╪═════════════════════╪═══════════╪════════════╪══════════════╪══════════════╡
│   0 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│   1 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│   2 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│   3 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│   4 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│   5 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│   6 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│   7 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│   8 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│   9 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│  10 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│  11 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│  12 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  13 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  14 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  15 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  16 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  17 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  18 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  19 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  20 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  21 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  22 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  23 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  24 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  25 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  26 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  27 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  28 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  29 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  30 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  31 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  32 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  33 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  34 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  35 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  36 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  37 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  38 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  39 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  40 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  41 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  42 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  43 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  44 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  45 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  46 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  47 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  48 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│  49 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│  50 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│  51 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  52 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  53 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  54 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  55 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  56 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  57 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  58 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  59 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  60 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│  61 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│  62 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│  63 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  64 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  65 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  66 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  67 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  68 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  69 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  70 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  71 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  72 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│  73 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│  74 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│  75 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  76 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  77 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  78 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  79 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  80 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  81 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  82 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  83 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  84 │ nurbs_control_point │         1 │ -10        │  -100        │   100        │
│  85 │ nurbs_control_point │         2 │ -30        │  -100        │   100        │
│  86 │ nurbs_control_point │         3 │ -30        │  -100        │   100        │
│  87 │ nurbs_control_point │         1 │  -3.35587  │  -100        │   100        │
│  88 │ nurbs_control_point │         2 │ -10.0672   │  -100        │   100        │
│  89 │ nurbs_control_point │         3 │ -10.1256   │  -100        │   100        │
│  90 │ nurbs_control_point │         1 │   3.35587  │  -100        │   100        │
│  91 │ nurbs_control_point │         2 │  10.0672   │  -100        │   100        │
│  92 │ nurbs_control_point │         3 │  10.1256   │  -100        │   100        │
│  93 │ nurbs_control_point │         1 │  10        │  -100        │   100        │
│  94 │ nurbs_control_point │         2 │  30        │  -100        │   100        │
│  95 │ nurbs_control_point │         3 │  30        │  -100        │   100        │
│  96 │ nurbs_control_point │         1 │   1.00748  │  -100        │   100        │
│  97 │ nurbs_control_point │         2 │   3.01265  │  -100        │   100        │
│  98 │ nurbs_control_point │         3 │  -4.12085  │  -100        │   100        │
│  99 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 100 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 101 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 102 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 103 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 104 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 105 │ nurbs_control_point │         1 │   1.00748  │  -100        │   100        │
│ 106 │ nurbs_control_point │         2 │   3.01265  │  -100        │   100        │
│ 107 │ nurbs_control_point │         3 │  -4.12085  │  -100        │   100        │
│ 108 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 109 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 110 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 111 │ nurbs_control_point │         1 │  -0.334536 │  -100        │   100        │
│ 112 │ nurbs_control_point │         2 │  -1.00039  │  -100        │   100        │
│ 113 │ nurbs_control_point │         3 │   1.3638   │  -100        │   100        │
│ 114 │ nurbs_control_point │         1 │  -0.334536 │  -100        │   100        │
│ 115 │ nurbs_control_point │         2 │  -1.00039  │  -100        │   100        │
│ 116 │ nurbs_control_point │         3 │   1.3638   │  -100        │   100        │
│ 117 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 118 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 119 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 120 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 121 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 122 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 123 │ nurbs_control_point │         1 │  -0.334536 │  -100        │   100        │
│ 124 │ nurbs_control_point │         2 │  -1.00039  │  -100        │   100        │
│ 125 │ nurbs_control_point │         3 │   1.3638   │  -100        │   100        │
│ 126 │ nurbs_control_point │         1 │  -0.334536 │  -100        │   100        │
│ 127 │ nurbs_control_point │         2 │  -1.00039  │  -100        │   100        │
│ 128 │ nurbs_control_point │         3 │   1.3638   │  -100        │   100        │
│ 129 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 130 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 131 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 132 │ nurbs_control_point │         1 │   1.00748  │  -100        │   100        │
│ 133 │ nurbs_control_point │         2 │   3.01265  │  -100        │   100        │
│ 134 │ nurbs_control_point │         3 │  -4.12085  │  -100        │   100        │
│ 135 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 136 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 137 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 138 │ nurbs_control_point │         1 │   0.334195 │  -100        │   100        │
│ 139 │ nurbs_control_point │         2 │   0.999372 │  -100        │   100        │
│ 140 │ nurbs_control_point │         3 │  -1.36121  │  -100        │   100        │
│ 141 │ nurbs_control_point │         1 │   1.00748  │  -100        │   100        │
│ 142 │ nurbs_control_point │         2 │   3.01265  │  -100        │   100        │
│ 143 │ nurbs_control_point │         3 │  -4.12085  │  -100        │   100        │
│ 144 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 145 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 146 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 147 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 148 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 149 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 150 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 151 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 152 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 153 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 154 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 155 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 156 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 157 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 158 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 159 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 160 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 161 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 162 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 163 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 164 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 165 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 166 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 167 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 168 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 169 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 170 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 171 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 172 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 173 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 174 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 175 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 176 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 177 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 178 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 179 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 180 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 181 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 182 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 183 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 184 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 185 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 186 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 187 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 188 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 189 │ nurbs_weight        │         1 │   1        │     0        │    10        │
│ 190 │ nurbs_weight        │         2 │   1        │     0        │    10        │
│ 191 │ nurbs_weight        │         3 │   1        │     0        │    10        │
│ 192 │ decenter            │         4 │  48.4924   │    43.4924   │    53.4924   │
│ 193 │ decenter            │         4 │   7.07107  │     2.07107  │    12.0711   │
│ 194 │ tilt                │         4 │  -0.785398 │    -0.872665 │    -0.698132 │
╘═════╧═════════════════════╧═══════════╧════════════╧══════════════╧══════════════╛
[ ]:
optimizer = optimization.OptimizerGeneric(problem)
res = optimizer.optimize()
[ ]:
problem.info()
[ ]:
spot = analysis.SpotDiagram(nurbs_tel, num_rings=18)
_ = spot.view()
[ ]:
_ = nurbs_tel.draw()