1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import numpy as np from scipy.integrate import quad from sympy import symbols, diff, integrate, solve, pi
def solve_bezier_problem(): t, v = symbols('t v')
P0, P1, P2, P3 = (1, 0), (1, v), (v, 1), (0, 1)
x = (1-t)**3 * P0[0] + 3*(1-t)**2 * t * P1[0] + 3*(1-t) * t**2 * P2[0] + t**3 * P3[0] y = (1-t)**3 * P0[1] + 3*(1-t)**2 * t * P1[1] + 3*(1-t) * t**2 * P2[1] + t**3 * P3[1]
dy_dt = diff(y, t) area_expr = integrate(x * dy_dt, (t, 0, 1)) target_area = pi / 4 v_solution = solve(area_expr - target_area, v) v_val = float(v_solution[0]) print(f"解得 v 的值为: {v_val:.15f}")
dx_dt_func = diff(x, t).subs(v, v_val) dy_dt_func = diff(y, t).subs(v, v_val) from sympy import lambdify f_dx = lambdify(t, dx_dt_func, 'numpy') f_dy = lambdify(t, dy_dt_func, 'numpy')
def integrand(t_val): return np.sqrt(f_dx(t_val)**2 + f_dy(t_val)**2)
L, error = quad(integrand, 0, 1, limit=100) arc_length_circle = np.pi / 2 percentage_diff = 100 * (L - arc_length_circle) / arc_length_circle
print(f"贝塞尔曲线长度 L: {L:.15f}") print(f"四分之一圆弧长度: {arc_length_circle:.15f}") print(f"百分比差异: {percentage_diff:.10f}%")
if __name__ == "__main__": solve_bezier_problem()
|