gpt4 book ai didi

wolfram-mathematica - 数学 : FindRoot for common tangent

转载 作者:行者123 更新时间:2023-12-04 13:03:04 31 4
gpt4 key购买 nike

我问这个question不久前确实有助于达成解决方案。我已经找到了一种可以接受的方法,但仍然没有完全达到我想要的效果。假设有两个函数 f1[x]g1[y] 我想确定 xy< 的值 用于公切线。我至少可以确定 xy 作为切线之一,例如:

f1[x_]:=(5513.12-39931.8x+23307.5x^2+(-32426.6+75662.x-43235.4x^2)Log[(1.-1.33333x)/(1.-1.x)]+x(-10808.9+10808.9x)Log[x/(1.-1.x)])/(-1.+x)
g1[y_]:=(3632.71+3806.87y-51143.6y^2+y(-10808.9+10808.9y)Log[y/(1.-1.y)]+(-10808.9+32426.6y-21617.7y^2)Log[1.-(1.y)/(1.-1.y)])/(-1.+y)

Show[
Plot[f1[x],{x,0,.75},PlotRange->All],
Plot[g1[y],{y,0,.75},PlotRange->All]
]

Chop[FindRoot[
{
(f1[x]-g1[y])/(x-y)==D[f1[x],x]==D[g1[y],y]
},
{x,0.0000001},{y,.00000001}
]
[[All,2]]
]

但是,您会从图中注意到,在 xy 稍大的值处存在另一个公切线(比如 x ~ 4 和 y ~ 5)。现在,有趣的是,如果我将 f1[x]g1[y] 的上述表达式稍微更改为如下所示:

    f2[x_]:=(7968.08-59377.8x+40298.7x^2+(-39909.6+93122.4x-53212.8x^2)Log[(1.-1.33333x)/(1.-1.x)]+x(-13303.2+13303.2x)Log[x/(1.-1.x)])/(-1.+x)
g2[y_]:=(5805.16-27866.2y-21643.y^2+y(-13303.2+13303.2y)Log[y/(1.-1.y)]+(-13303.2+39909.6y-26606.4y^2)Log[1.-(1.y)/(1.-1.y)])/(-1.+y)

Show[
Plot[f2[x],{x,0,.75},PlotRange->All],
Plot[g2[y],{y,0,.75},PlotRange->All]
]

Chop[FindRoot[
{
(f2[x]-g2[y])/(x-y)==D[f2[x],x]==D[g2[y],y]
},
{x,0.0000001},{y,.00000001}
]
[[All,2]]
]

并且使用相同的方法来确定公切线,Mathematica 选择为正斜率正切找到 xy 中较大的值。

最后,我的问题是:是否有可能让 Mathematica 找到公切线的高 xy 值,并以类似的方式存储这些值这让我可以制作一个列表图?上面的函数 fg 都是另一个变量 z 的复杂函数,我目前正在使用类似下面的东西来绘制切线点(应该是两个 x 和两个 y)作为 z 的函数。

ex[z_]:=Chop[FindRoot[
{
(f[x,z]-g[y,z])/(x-y)==D[f[x],x]==D[g[y],y]
},
{x,0.0000001},{y,.00000001}
]
[[All,2]]
]

ListLinePlot[
Table[{ex[z][[i]],z},{i,1,2},{z,1300,1800,10}]
]

最佳答案

要找到可以求解方程的 {x, y} 的估计值,您可以在 ContourPlot 中绘制它们并寻找交点。例如

f1[x_]:=(5513.12-39931.8 x+23307.5 x^2+(-32426.6+75662. x- 
43235.4 x^2)Log[(1.-1.33333 x)/(1.-1.x)]+
x(-10808.9+10808.9 x) Log[x/(1.-1.x)])/(-1.+x)
g1[y_]:=(3632.71+3806.87 y-51143.6 y^2+y (-10808.9+10808.9y) Log[y/(1.-1.y)]+
(-10808.9+32426.6 y-21617.7 y^2) Log[1.-(1.y)/(1.-1.y)])/(-1.+y)

plot = ContourPlot[{f1'[x] == g1'[y], f1[x] + f1'[x] (y - x) == g1[y]},
{x, 0, 1}, {y, 0, 1}, PlotPoints -> 40]

Mathematica graphics

如您所见,区间 (0,1) 中有 2 个交点。然后您可以从图中读取点并将它们用作 FindRoot 的起始值:

seeds = {{.6,.4}, {.05, .1}};
sol = FindRoot[{f1'[x] == g1'[y], f1[x] + f1'[x] (y - x) == g1[y]},
{x, #1}, {y, #2}] & @@@ seeds

要从 sol 中获取点对,您可以使用 ReplaceAll:

points = {{x, f1[x]}, {y, g1[y]}} /. sol

(*
==> {{{0.572412, 19969.9}, {0.432651, 4206.74}},
{{0.00840489, -5747.15}, {0.105801, -7386.68}}}
*)

为了证明这些点是正确的:

Show[Plot[{f1[x], g1[x]}, {x, 0, 1}],
{ParametricPlot[#1 t + (1 - t) #2, {t, -5, 5}, PlotStyle -> {Gray, Dashed}],
Graphics[{PointSize[Medium], Point[{##}]}]} & @@@ points]

Mathematica graphics

关于wolfram-mathematica - 数学 : FindRoot for common tangent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993850/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com