如何在Visual Basic中求解方程

时间:2016-01-13 19:36:40

标签: vb.net trigonometry solver

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

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

这种情况下的变量是x,给出了常数L,H1和H2。我不相信Visual Basic有一个原生求解器,所以我需要帮助。

提前致谢,

Pedro Guaraldi

2 个答案:

答案 0 :(得分:2)

据我所知,这不是一个可以手工解决的方程式,也不是一个程序中优雅的方程式。

如果你需要在一个程序中解决这个问题,并且暴力不是一个选择,那么你似乎只是运气不好。如果您可以使用外部资源解决问题,请向下滚动以查找解决方案。

我想通过为等式格式道歉道歉。不幸的是,StackOverflow目前不支持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轴(我们真正的根)的每个地方。这是什么样的(忽略垂直条,它们是渐近线):

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

如您所见,我们正在寻找大量解决方案 - 此图表仅为-0.6至0.6!有了这个,如果我们问WolframAlpha solve for h(x) = 0,我们会得到很多数字。这只是标准的计算时间 - 还有很多要计算的东西。

因此,如果WolframAlpha可以解决它,那么问题是什么?

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

那么我的等式的问题是什么呢?

等式的问题是tan(L*x)。首先,如果你的方程中有一个触发函数,那么几乎没有办法解决它(除非选择特殊情况)。由于你的变量在你的trig函数里面,而trig函数是循环的(也就是说,它们重复),你基本上得到了无数的答案。

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

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

首先,当你看到x的值,其中h(x)= 0时,你可能会认为它们线性增加 - 不幸的是,它们没有。这意味着您需要单独解决每个值 - 并且根据您要查找的解决方案数量,这需要进行大量计算。

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

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

答案 1 :(得分:2)

您可以使用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