我正在创建一个程序,使用Visual Basic根据某些边界条件计算板坯的温度分布。在开发过程中,我需要解决这样的方程式:
tan(x*L) = x * (H1 + H2) / (x^2 - H1*H2)
这种情况下的变量是x,给出了常数L,H1和H2。我不相信Visual Basic有一个原生求解器,所以我需要帮助。
提前致谢,
Pedro Guaraldi
答案 0 :(得分:2)
如果你需要在一个程序中解决这个问题,并且暴力不是一个选择,那么你似乎只是运气不好。如果您可以使用外部资源解决问题,请向下滚动以查找解决方案。
我想通过为等式格式道歉道歉。不幸的是,StackOverflow目前不支持MathJax。
我继续用一些任意常数绘制你的等式,看看我们在这里看到了什么。你拥有的是:
f(x) = tan(L*x)
g(x) = x * (H1 + H2) / (x^2 - H1 * H2)
我选择H1 = 3
,H2 = 4
和L = 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轴(我们真正的根)的每个地方。这是什么样的(忽略垂直条,它们是渐近线):
如您所见,我们正在寻找大量解决方案 - 此图表仅为-0.6至0.6!有了这个,如果我们问WolframAlpha solve for h(x) = 0,我们会得到很多数字。这只是标准的计算时间 - 还有很多要计算的东西。
问题是您的应用程序不像WolframAlpha服务器那样强大,也不可能变得强大。虽然你可以编写一个函数来强制通过测试x值后的值来计算它,但我不知道你希望解决方程的速度有多快。
等式的问题是tan(L*x)
。首先,如果你的方程中有一个触发函数,那么几乎没有办法解决它(除非选择特殊情况)。由于你的变量在你的trig函数里面,而trig函数是循环的(也就是说,它们重复),你基本上得到了无数的答案。
阅读你的问题,我不清楚你是否必须在VB.NET中解决它,或者你是否可以使用图形或像WolframAlpha这样的来源来计算它。
首先,当你看到x的值,其中h(x)= 0时,你可能会认为它们线性增加 - 不幸的是,它们没有。这意味着您需要单独解决每个值 - 并且根据您要查找的解决方案数量,这需要进行大量计算。
然后你的等式为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