TSC999 发表于 2017-6-28 10:58:18

如何用 mathmatica 求该问题的理论最大值

问题: 已知 \( x^2+y^2 =1 \),求 \( (x+1)(y+2) \) 的最大值。要理论表达式。

用下面的代码可以求出数字解:

FindMaximum[{(x + 1) (y + 2), x^2 + y^2 == 1}, {x, y}]

用下面的代码可以求出理论表达式,但公式并不是最简的:

Maximize[{(x + 1)*(y + 2), x^2 + y^2 == 1}, {x, y}] //
RootReduce // ToRadicals

如何得到满意的解答?

zeroieme 发表于 2017-6-28 12:11:13

Maximize[{(x+1)*(y+2),x^2+y^2==1},{x,y}]//FullSimplify
在根函数Root下已经是最简单的,再搞成三角函数反而变复杂了。
可以用ToRadicals解析根函数容易理解。
Maximize[{(x+1)*(y+2),x^2+y^2==1},{x,y}]//FullSimplify//ToRadicals

kastin 发表于 2017-6-28 14:48:09

计算机擅长按照固定的规则、程序步骤执行任务,所以你必须告诉它什么叫做最简形式。实际上,很难找到一个统一有效的、合理的、确定的最简表达式的定义。因为,在不同情况下,人们心里所预期的“最简形式”的标准往往会发生改变。所以,对于计算机而言,无法在任何情况下都能自动给出你所预期的最简结果。但它可以给出在给定标准下的最简结果。

比如 Simplify 函数和 FullSimplify 函数(后者能处理特殊的数学函数)都提供了一个叫做 ComplexityFunction 的选项,该选项可以指定一个函数用于评估某个表达式的复杂程度,从而为计算机提供一个“最简表达式”的定量标准。默认情况下,这个函数被指定为统计子表达式的个数和其中整数的位数(两者权重不一样,前者对于复杂度的贡献最大)来计算复杂度的值,因此,你给的例子的结果如果用根式表达,根据它默认的标准看来,属于非常复杂的表达式,并不如系统内部自带的Root对象简单,故返回的是Root对象就不难理解了。

再举两个简单一点的例子:
1. `10\ln 2,\ln 1024` 这两个表达式谁更简单?按照通常的数学书写习惯,有些人认为前者更简单,但从系统默认标准来看,后者才是最简单的。想要返回第一种结果,就必须找到并给出一个复杂度函数,使得前者的复杂度比后者低(当然这样的函数非常多,但不一定任何情况都有效,取决于怎么去设定这个标准):
FullSimplify]
FullSimplify,
ComplexityFunction -> (Total@
   IntegerLength@
      Cases[ #, _Integer, {0, Infinity}, Heads -> True] &)]

2. 切比雪夫函数与双曲三角函数一样,虽然有专门的函数名,但是它还可以写成通常的初等函数表达的形式。从形式上来说,直接用专门的函数名肯定比用初等函数表达形式更简单,那如果想要用初等表达式表达呢?设计两个复杂度函数,使得专们名称的函数其复杂度比初等表达形式的更大就行:
f := 100 Count + LeafCount
FullSimplify, ComplexityFunction -> f]
g := 100 Count +
LeafCount
FullSimplify, ComplexityFunction -> g]
总的来说,计算机很呆板,只会按照你给的规则和标准来执行,想要满足你的心意,就必须按照它的方式告诉它该怎么做,目前人类设计的计算机只是个工具而已,无法自己思考,未来人工智能发展成熟之后或许能办到。

TSC999 发表于 2017-6-28 15:45:51

本帖最后由 TSC999 于 2017-6-28 16:07 编辑

用 Simplify 可以简化本例中最大值表达式,见下述代码。
Simplify[\!\(TraditionalForm\`
\*FractionBox[\(1\), \(48\)]\ \((96 +
\*RadicalBox[\(297216 - 11712\
\*SqrtBox[\(183\)]\), \(3\)] + 4\
\*RadicalBox[\(3\ \((1548 + 61\
\*SqrtBox[\(183\)])\)\), \(3\)])\)\)]

用 Simplify 也可以简化本例中的 $ y $ 表达式,见下述代码。
Simplify[\!\(TraditionalForm\`\(TraditionalForm\`
\*FractionBox[\(1\), \(12\)]\ \((\(-8\) +
\*RadicalBox[\(496 - 24\
\*SqrtBox[\(183\)]\), \(3\)] + 2\
\*RadicalBox[\(62 + 3\
\*SqrtBox[\(183\)]\), \(3\)])\)\)\)]

但是为什么用 Simplify 就不能简化本例中的 $ x $ 表达式呢?见下述代码。
Simplify[\!\(TraditionalForm\`\(TraditionalForm\`\(TraditionalForm\`
\*FractionBox[\(1\), \(2\)]\ \((
\*FractionBox[
RadicalBox[\(27 + 2\
\*SqrtBox[\(183\)]\), \(3\)],
SuperscriptBox[\(3\), \(2/3\)]] -
\*FractionBox[\(1\),
RadicalBox[\(3\ \((27 + 2\
\*SqrtBox[\(183\)])\)\), \(3\)]])\)\)\)\)]


从前两个代码的运行结果看,确实公式得到了简化(无论是怎样的评判标准!)
而最后这个关于$ x $的表达式呢?也并非是不能简化的(无论是怎样的评判标准!)。

根据上面的结果,可以写出下面的代码:
a = Maximize[{(x + 1)*(y + 2), x^2 + y^2 == 1}, {x, y}] //
    RootReduce // ToRadicals;
Simplify
这个代码的缺点是没有把$ x $的表达式加以简化。


chyanog 发表于 2017-6-28 16:17:01

本帖最后由 chyanog 于 2017-6-28 16:18 编辑

双曲函数形式
\[\text{maximize}\to 2+\frac{1}{6} \sqrt{249} \cosh \left(\frac{1}{3} \tanh ^{-1}\left(\frac{61 \sqrt{183}}{1548}\right)\right)\]
\
\

chyanog 发表于 2017-6-28 16:25:09

本帖最后由 chyanog 于 2017-6-28 18:39 编辑

TSC999 发表于 2017-6-28 15:45
用 Simplify 可以简化本例中最大值表达式,见下述代码。




在贴吧不是已经问过了吗,你认为没有简化,其实就是没有分母有理化
Maximize[{(x+1)*(y+2),x^2+y^2==1},{x,y}]//RootReduce//ToRadicals;
%/.x_^(-1/3):>RootReduce^(1/3)//Simplify

wayne 发表于 2017-6-29 10:24:49

楼主如果足够用心的话,可以把#3 @kastin的 观点吸收进来[人家花那么多时间打字,你是不是该表示一下], 然后 揉合一下.得到的结果跟楼上chyanog 吧主高端的RuleDelayed的代码的结果是 殊途同归的. ^_^
Maximize[{(x + 1)*(y + 2), x^2 + y^2 == 1}, {x, y}] // RootReduce // ToRadicals;
FullSimplify[%, ComplexityFunction -> Depth] // Together

==========
其实跟zeroieme 也是一致的.

TSC999 发表于 2017-6-30 12:32:29

谢谢各位大师和高手! 这个帖子对于像本人这样的 mathmatica 初学者,是很好的教材,需要慢慢学习和领会。
页: [1]
查看完整版本: 如何用 mathmatica 求该问题的理论最大值