vx_historia = []
vy_historia = []
para ello en el rango (iters): init_vx_wp = wp.array(np.array([vx_value]dtype=np.float32), dtype=wp.float32, dispositivo=dispositivo, require_grad=True) init_vy_wp = wp.array(np.array([vy_value]dtype=np.float32), dtype=wp.float32, dispositivo=dispositivo, requiere_grad=True) x_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo, requiere_grad=True) y_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo, requiere_grad=True) vx_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo, require_grad=True) vy_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo, require_grad=True) loss_wp = wp.zeros(1, dtype=wp.float32, dispositivo=dispositivo, require_grad=True) tape = wp.Tape() con cinta: wp.launch( kernel=init_projectile_kernel, dim=1, inputs=[]salidas =[x_hist_wp, y_hist_wp, vx_hist_wp, vy_hist_wp, init_vx_wp, init_vy_wp]dispositivo=dispositivo, ) wp.launch( kernel=projectile_step_kernel, dim=proj_steps, entradas=[proj_dt, proj_g]salidas =[x_hist_wp, y_hist_wp, vx_hist_wp, vy_hist_wp]dispositivo=dispositivo, ) wp.launch( kernel=projectile_loss_kernel, dim=1, entradas=[proj_steps, target_x, target_y]salidas =[x_hist_wp, y_hist_wp, loss_wp]dispositivo = dispositivo, ) tape.backward(loss=loss_wp) wp.synchronize() current_loss = float(loss_wp.numpy()[0]) grad_vx = flotante(init_vx_wp.grad.numpy()[0]) grad_vy = flotante(init_vy_wp.grad.numpy()[0]) vx_value = np.float32(vx_value – lr * grad_vx) vy_value = np.float32(vy_value – lr * grad_vy) loss_history.append(current_loss) vx_history.append(float(vx_value)) vy_history.append(float(vy_value)) si % 10 == 0 o == iteros – 1: print(f”iter={it:02d} pérdida={current_loss:.6f} vx={vx_value:.4f} vy={vy_value:.4f} grad=({grad_vx:.4f}, {grad_vy:.4f})”) final_init_vx_wp = wp.array(np.array([vx_value]dtype=np.float32), dtype=wp.float32, dispositivo=dispositivo) final_init_vy_wp = wp.array(np.array([vy_value]dtype=np.float32), dtype=wp.float32, dispositivo=dispositivo) x_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo) y_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo) vx_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo) vy_hist_wp = wp.zeros(proj_steps + 1, dtype=wp.float32, dispositivo=dispositivo) wp.launch( kernel=init_projectile_kernel, dim=1, entradas=[]salidas =[x_hist_wp, y_hist_wp, vx_hist_wp, vy_hist_wp, final_init_vx_wp, final_init_vy_wp]dispositivo=dispositivo, ) wp.launch( kernel=projectile_step_kernel, dim=proj_steps, entradas=[proj_dt, proj_g]salidas =[x_hist_wp, y_hist_wp, vx_hist_wp, vy_hist_wp]dispositivo = dispositivo, ) wp.synchronize() x_path = x_hist_wp.numpy() y_path = y_hist_wp.numpy() fig = plt.figure(figsize=(15, 4)) ax1 = fig.add_subplot(1, 3, 1) ax1.plot(loss_history) ax1.set_title(“Pérdida de optimización”) ax1.set_xlabel(“Iteración”) ax1.set_ylabel(“Distancia al cuadrado”) ax2 = fig.add_subplot(1, 3, 2) ax2.plot(vx_history, label=”vx”) ax2.plot(vy_history, label=”vy”) ax2.set_title(“Velocidad inicial aprendida”) ax2.set_xlabel(“Iteración”) ax2.legend() ax3 = fig.add_subplot(1, 3, 3) ax3.plot(x_path, y_path, linewidth=2) ax3.scatter([target_x], [target_y]s=80, marcador=”x”) ax3.set_title(“Trayectoria diferenciable del proyectil”) ax3.set_xlabel(“x”) ax3.set_ylabel(“y”) ax3.set_ylim(-0.1, max(1.0, float(np.max(y_path)) + 0.3)) plt.tight_layout() plt.show() final_dx = flotador(x_path[-1] – target_x) final_dy = float(y_path[-1] – target_y) final_dist = math.sqrt(final_dx * final_dx + final_dy * final_dy) print(f”Distancia final fallida del objetivo: {final_dist:.6f}”) print(f”Velocidad inicial optimizada: vx={vx_value:.6f}, vy={vy_value:.6f}”)