找回密码
 欢迎注册
查看: 15537|回复: 12

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

[复制链接]
发表于 2017-6-28 10:58:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

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

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

  1. FindMaximum[{(x + 1) (y + 2), x^2 + y^2 == 1}, {x, y}]
复制代码


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

  1. Maximize[{(x + 1)*(y + 2), x^2 + y^2 == 1}, {x, y}] //
  2.   RootReduce // ToRadicals
复制代码


如何得到满意的解答?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-6-28 12:11:13 | 显示全部楼层
  1. Maximize[{(x+1)*(y+2),x^2+y^2==1},{x,y}]//FullSimplify
复制代码

在根函数Root下已经是最简单的,再搞成三角函数反而变复杂了。
可以用ToRadicals解析根函数容易理解。
  1. Maximize[{(x+1)*(y+2),x^2+y^2==1},{x,y}]//FullSimplify//ToRadicals
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-6-28 14:48:09 | 显示全部楼层
计算机擅长按照固定的规则、程序步骤执行任务,所以你必须告诉它什么叫做最简形式。实际上,很难找到一个统一有效的、合理的、确定的最简表达式的定义。因为,在不同情况下,人们心里所预期的“最简形式”的标准往往会发生改变。所以,对于计算机而言,无法在任何情况下都能自动给出你所预期的最简结果。但它可以给出在给定标准下的最简结果。

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

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

2. 切比雪夫函数与双曲三角函数一样,虽然有专门的函数名,但是它还可以写成通常的初等函数表达的形式。从形式上来说,直接用专门的函数名肯定比用初等函数表达形式更简单,那如果想要用初等表达式表达呢?设计两个复杂度函数,使得专们名称的函数其复杂度比初等表达形式的更大就行:
  1. f[e_] := 100 Count[e, _ChebyshevT, {0, Infinity}] + LeafCount[e]
  2. FullSimplify[ChebyshevT[n, x], ComplexityFunction -> f]
  3. g[e_] := 100 Count[e, _Sinh | Cosh | Tanh, {0, Infinity}] +
  4.   LeafCount[e]
  5. FullSimplify[Sinh[x], ComplexityFunction -> g]
复制代码

总的来说,计算机很呆板,只会按照你给的规则和标准来执行,想要满足你的心意,就必须按照它的方式告诉它该怎么做,目前人类设计的计算机只是个工具而已,无法自己思考,未来人工智能发展成熟之后或许能办到。

点评

感谢 kastin 大师详细的指导!  发表于 2017-6-29 14:53
^_^, 人家表示看不懂你的逻辑.  发表于 2017-6-29 10:18
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-6-28 15:45:51 | 显示全部楼层
本帖最后由 TSC999 于 2017-6-28 16:07 编辑

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


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


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



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

根据上面的结果,可以写出下面的代码:
  1. a = Maximize[{(x + 1)*(y + 2), x^2 + y^2 == 1}, {x, y}] //
  2.     RootReduce // ToRadicals;
  3. Simplify[a]
复制代码

这个代码的缺点是没有把  $ x $  的表达式加以简化。


点评

不明白你的意思,本来就是三次方程的根  发表于 2018-3-22 17:07
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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)\]
\[x\to \frac{1}{3} \sqrt{3} \sinh \left(\frac{1}{3} \tanh ^{-1}\left(\frac{9 \sqrt{183}}{122}\right)\right)\]
\[y\to \frac{1}{3} \left(\sqrt{13} \cosh \left(\frac{1}{3} \tanh ^{-1}\left(\frac{3 \sqrt{183}}{62}\right)\right)-2\right)\]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-6-28 16:25:09 | 显示全部楼层
本帖最后由 chyanog 于 2017-6-28 18:39 编辑
TSC999 发表于 2017-6-28 15:45
用 Simplify 可以简化本例中最大值表达式,见下述代码。


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

点评

(⊙﹏⊙),我哪里是什么大师。。在贴吧的小吧主是大吧主安排的  发表于 2017-6-28 18:43
谢谢大师!原来您在 MMA 做吧主啊。贴吧中的上述代码,:> 原来就是 :→ 呀。我是直接输入冒号加箭头,所以代码就弄不对。  发表于 2017-6-28 17:47
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-6-29 10:24:49 | 显示全部楼层
楼主如果足够用心的话,可以把#3 @kastin的 观点吸收进来[人家花那么多时间打字,你是不是该表示一下], 然后 揉合一下.得到的结果跟楼上chyanog 吧主高端的RuleDelayed的代码的结果是 殊途同归的. ^_^
  1. Maximize[{(x + 1)*(y + 2), x^2 + y^2 == 1}, {x, y}] // RootReduce // ToRadicals;
  2. FullSimplify[%, ComplexityFunction -> Depth] // Together
复制代码


==========
其实跟zeroieme 也是一致的.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-6-30 12:32:29 | 显示全部楼层
谢谢各位大师和高手! 这个帖子对于像本人这样的 mathmatica 初学者,是很好的教材,需要慢慢学习和领会。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-25 23:19 , Processed in 0.075273 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表