You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:48:03