如何在LibreOffice Calc中求解基于Miner与Wöhler公式的非线性方程并映射至对应数据列
如何在LibreOffice Calc中求解基于Miner与Wöhler公式的非线性方程并映射至对应数据列
嗨,针对你这个结合Miner和Wöhler公式的非线性方程求解需求,我来一步步教你在LibreOffice Calc里实现,还能把结果批量映射到你的数据列中~
首先咱们先把公式理清楚,方便后续在Calc里写表达式:
已知Wöhler公式的对数形式:
log₁₀(Nᵢ) = 7*(1 - (σfᵢ - σₑ)/(σᵤ - σₑ))
其中σᵤ是全局变量(你设定为1300),我们可以把它转换成Nᵢ的直接计算式:Nᵢ = 10^(7*(1 - (σfᵢ - σₑ)/(1300 - σₑ)))
然后代入Miner的损伤累积方程:
n₁/N₁ + n₂/N₂ = 1
这就变成了一个关于σₑ的非线性方程,我们要对每一行的A列(n₁)、B列(n₂)、C列(σf₁)、D列(σf₂)求解σₑ。
下面提供两种可行的方法,你可以根据需求选择:
方法一:使用Solver非线性规划扩展(适合精准求解)
你提到找不到Solver的文档,没关系,我给你一步步拆解操作:
- 确认Solver扩展已安装:打开Calc,点击「工具」→「扩展管理器」,检查是否有「Solver for Nonlinear Programming」;如果没有,直接在扩展管理器里搜索安装即可。
- 准备数据与公式:假设你的数据从第2行开始(第1行是表头),我们在E2单元格放待求解的σₑ(先随便填个初始值,比如250),然后在F2单元格写入Miner方程的计算式:
这个公式会根据当前E2的σₑ值,计算Miner方程左边的结果,我们的目标是让这个结果等于1。=A2/(10^(7*(1-(C2-E2)/(1300-E2)))) + B2/(10^(7*(1-(D2-E2)/(1300-E2)))) - 配置Solver参数:
- 点击「工具」→「Solver」打开面板;
- 「目标单元格」选择F2,「目标值」输入1,「通过改变单元格」选择E2;
- 添加约束条件:点击「添加」,设置
E2 >= 200和E2 <= 300(和你在Maxima里的求解范围一致); - 求解方法选择「非线性」,因为我们的方程是非线性的;
- 求解并验证:点击「求解」,Solver会自动计算出E2的σₑ值,让F2的结果接近1。你可以和Maxima的结果对比,确保计算正确。
- 批量处理:把E2和F2的公式下拉到所有数据行,然后逐行重复上述Solver操作;如果数据量很大,也可以录制宏来批量执行求解步骤。
方法二:使用内置的目标搜索工具(操作更简便)
如果你觉得Solver设置太繁琐,Calc内置的「目标搜索」工具也能搞定单变量非线性方程求解:
- 准备公式:和方法一一样,E2填初始值250,F2写入Miner方程的计算式;
- 启动目标搜索:选中F2单元格,点击「工具」→「目标搜索」;
- 设置参数:在对话框中,「目标值」填1,「可变单元格」选择E2;
- 自动求解:点击「确定」,Calc会自动迭代计算,找到让F2等于1的E2值(σₑ);
- 批量处理:同样可以录制宏,把目标搜索的操作录下来,然后对每一行数据运行宏,实现批量求解。
一些小提示
- 初始值尽量选在200-300之间(比如250),这样迭代更容易收敛;
- 如果出现求解失败的情况,先检查公式是否写错,或者确认σₑ的范围是否合理(你的σf都在200-300,σₑ的解大概率也在这个区间);
- 可以拿一组数据在Maxima和Calc里分别求解,对比结果验证正确性。
备注:内容来源于stack exchange,提问作者Foad S. Farimani
相关产品推荐
相关产品推荐

