如何让fsolve函数在带x∈[1/4,1/3]约束的for循环中正常运行
问题修正与解决方案
原代码核心问题
- 缺失全局变量
design_ratio的定义,运行会直接报变量未定义错误 - 循环缩进完全错误,内层
for j循环下的代码无缩进未进入循环执行,且x = 0.00001 * x逻辑错误,右侧x未初始化,原本应为x = 0.00001 * j生成[0.25555, 0.33332]范围内的x值 fsolve调用位置错误,当前写在所有循环外,仅执行一次求解,无法输出13组结果- 角度单位错误:初值传入的z=28为角度值,但numpy三角函数默认使用弧度计算,需先转换为弧度
- 无约束的fsolve无法直接固定x的取值,要约束x在指定范围,可把x作为已知参数传入方程组,仅求解y、z两个变量
修正后可运行代码
import numpy as np from scipy.optimize import fsolve # 请根据实际需求修改design_ratio取值 design_ratio = 0.8 def equations(vars, x): y, z = vars eq1 = ((x / (1 - x)) - (((2.5*np.cos(z)) / (8 * np.pi * np.sin(z) ** 2)) * (1 + (design_ratio * np.tan(z))))) eq2 = ((y / (1 + y)) - (2.5 / (8 * np.pi * np.cos(z))) * (1 - design_ratio * (1 / np.tan(z)))) eq3 = np.tan(z) - ((1-x) /( 1.40 * (1+y))) return [eq1, eq2, eq3] # 在1/4到1/3之间均匀取13个x值,满足约束要求 x_list = np.linspace(1/4, 1/3, 13) # 初值设置:y初值0.048,z初值28度转换为弧度 init_guess = (0.048, np.deg2rad(28)) for idx, x in enumerate(x_list): y, z = fsolve(equations, init_guess, args=(x,)) # 校验求解收敛性 residuals = equations((y, z), x) if np.all(np.abs(residuals) < 1e-6): print(f"第{idx+1}组结果:x={x:.6f}, y={y:.6f}, z(弧度)={z:.6f}, z(角度)={np.rad2deg(z):.2f}°") else: print(f"第{idx+1}组求解未收敛,x={x:.6f}")
内容的提问来源于stack exchange,提问作者mr21
相关产品推荐
相关产品推荐

