我正在尝试以符号方式优化表达式。我需要找出一个变量的最大值,以便表达式仍然具有有效的解决方案。
例如:
expr := (a-b)/b-(a^3) # a=(0,10), b= (0,10)
在这个表达式中,b = a ^ 3是唯一可能出现不确定解的情况。给定的变量间隔
这对于简单表达来说似乎不错。但是实际上,有两个以上的变量需要解决的复杂方程。
1)第一件事是找出导致未定义输出的变量的所有值
2)为该变量分配符号值,以便消除未定义的结果。
我需要优化给定的表达式,以便求解时不存在任何未定义的情况。我了解到,在优化时,变量始终存在一个条件(在这种情况下,变量max是条件,该变量可以采用的最大值)。表达式的输出始终是实数值
OptimizedExpr:=a-b[max]/b[max]-a[3] --> b[max]>a^3 or b[max]<a^3
(很容易对a ^ 3说b [max] <>,而a ^ 3是极限值。在某些情况下,忽略极限值的其他部分更为合理。因此,我想解决大于或小于极限值的问题
我将非常高兴,如何找到优化表达式。我尝试使用solve函数,但发现表达式等于零且求解。这与我所寻找的完全相反。我真的不知道有什么方法可以找出表达式中未定义的情况以及什么值的变量。
我尽力解释了这种情况,欢迎您提出任何建议的修改或进一步的信息。
答案 0 :(得分:1)
您写道,“ b = a ^ 3是唯一可能出现未定义解决方案的情况。”
因此,您看起来好像用方括号打了一个错字,并打算将表达式改为,
expr := (a-b)/(b-a^3);
discont
命令处理该示例。
discont(expr, b);
/ 3\
{ a }
\ /
如果您有更多涉及的表达式,请先显示它们(如果有这样的约束,对其他参数(例如a
的了解就不会感到受伤)。
如果您没有明确和完整地显示实际示例,很难正确回答。
[edit]好的,您在其他地方发布了一个涉及更多的示例。您可以使用discont
或singular
命令。
expr2 := tan(a*(b+log(1+(epsilon*a*r)/(c*s)))/2):
ans := [singular(expr2, {c, b})]:
ans := map[2](remove,u->lhs(u)=rhs(u), ans):
lprint(%);
[{c = 0}, {c = -epsilon*a*r/s},
{b = - (-2*_Z1*Pi+a*ln((a*epsilon*r+c*s)/(c*s))-Pi)/a}]
eval(expr2, ans[1]);
Error, numeric exception: division by zero
eval(expr2, ans[2]);
Error, (in ln) numeric exception: division by zero
eval(expr2, ans[3]):
simplify(%);
Error, (in tan) numeric exception: division by zero
ans1 := map[2](`=`,c,discont(expr2, c)):
lprint(%);
{c = 0, c = epsilon*a*r/(s*(exp((2*Pi*_Z2-a*b+Pi)/a)-1)),
c = -epsilon*a*r/s}
ans2 := map[2](`=`,b,discont(expr2, b)):
lprint(%);
{b = -(a*ln((a*epsilon*r+c*s)/(c*s))-2*Pi*_Z3-Pi)/a}
eval(expr2, ans1[1]);
Error, numeric exception: division by zero
eval(expr2, ans1[2]):
simplify(%) assuming real:
Error, (in assuming) when calling 'cot'. Received: 'numeric exception: division by zero'
eval(expr2, ans1[3]);
Error, (in ln) numeric exception: division by zero
eval(expr2, ans2[1]):
simplify(%) assuming real;
Error, (in assuming) when calling 'cot'. Received: 'numeric exception: division by zero'