如何在 Visual Basic 中求解方程

How to solve equations in Visual Basic

我正在创建一个程序,使用 Visual Basic 根据某些边界条件计算平板的温度分布。在开发过程中,我需要解这样一个方程:

tan(x*L) = x * (H1 + H2) / (x^2 - H1*H2)

本例中的变量为x,给出常数L、H1、H2。我不相信 Visual Basic 有本地求解器,所以我需要这方面的帮助。

提前致谢,

佩德罗·瓜拉尔迪

据我所知,这不是您可以手动或在程序中优雅求解的方程式。

如果您需要在程序中解决这个问题,而暴力破解不是一种选择,那么看来您只是运气不好。如果您可以使用外部资源解决它,请向下滚动找到解决方案。

我想先对公式格式表示歉意。不幸的是,Whosebug 目前不支持 MathJax。

我继续用一些任意常数绘制你的方程式,看看我们在这里看到的是什么。你拥有的是:

f(x) = tan(L*x)

g(x) = x * (H1 + H2) / (x^2 - H1 * H2)

我选择了 H1 = 3H2 = 4L = 5 的任意常数,给出了方程式

f(x) = tan(5x)

g(x) = 7x / (x^2 - 12)

您要查找的是这些函数相交的点 - f(x) = g(x)。但是,如果一切都在一侧,则更容易查看。我们将这个新方程表示为 h(x)

h(x) = tan(5x) - [7x / (x^2 - 12)]

现在我们有一张图,您要求解的是 h(x) = 0,或者我们的图与 x-axis(我们的真正根)相交的所有地方。这是它的样子(忽略竖线,它们是渐近线):

如您所见,我们正在研究很多解决方案 - 这张图只是从 -0.6 到 0.6!有了这个,如果我们要求 WolframAlpha solve for h(x) = 0,我们会得到很多数字。这只是标准计算时间——还有很多需要计算的时间。

那么如果WolframAlpha能解决,那问题是什么?

问题是您的应用程序没有,也不太可能变得像 WolframAlpha 服务器一样强大。虽然您可以编写一个函数来通过测试一个接一个的 x 值来暴力计算它,但我不知道您希望方程的求解速度有多快。

那么我的方程有什么问题呢?

你的方程式有问题 tan(L*x)。首先,如果你的方程中有一个三角函数,几乎没有办法把它解出来(除非 select 特殊情况)。由于你的变量在你的三角函数中,并且三角函数是循环的(也就是说,它们会重复),你基本上会得到无限多的答案。

但我需要以编程方式求解这个方程!

读了你的问题,我不清楚你是否必须在 VB.NET 内解决它,或者你是否可以使用图形或像 WolframAlpha 这样的来源来计算值。

起初,当您查看 h(x) = 0 时的 x 值时,您可能认为它们呈线性增加 - 不幸的是,它们并非如此。这意味着您需要单独求解每个值 - 根据您要查找的解的数量,计算量很大。

如果我不需要在程序中执行此操作并且可以使用像 WolframAlpha 这样的源怎么办?

那么你的等式是 tan(L*x) - [x * (H1 + H2) / (x^2 - H1 * H2)] = 0。插入你的常量,然后询问 WolframAlpha!

您可以使用 nonlinear solver 来执行此操作,而且我敢肯定,有些求解器具有您可以从 VB 使用的界面。或者,您可以编写一个文件并将求解器作为子进程调用。

AMPL 中有一个例子可以说明这个想法:

# test.ampl
param H1 = 3;
param H2 = 4;
param L = 5;
var x >= 0.1; # set lower bound to 0.1, because 0 is a trivial solution
s.t. c: tan(x*L) = x * (H1 + H2) / (x^2 - H1*H2);
option solver knitro;
solve;
print x;

这会产生以下输出:

KNITRO 9.1.0: Locally optimal solution.
objective 0; feasibility error 6.08e-11
6 iterations; 7 function evaluations
Objective = find a feasible point.
1.701346690729009