使用 SymPy 最大化功能 - 曲柄杆应用

问题描述 投票:0回答:1

我想知道曲柄杆应用的最坏情况。 Sketch 连杆中的力 Ft 由下式给出:

Equation

我想知道它的最大值。

我尝试在 Wolfram Alpha 或 SymPy 上解决它。请参阅以下代码:

import sympy as sym
# import numpy as np
r, l, A = sym.symbols('r, l, A', positive = 'True')
B= sym.asin(r/l*sym.sin(A))
f = sym.simplify(sym.sin(A+B)/sym.cos(B))
df=sym.simplify(sym.diff(f,A))
sln=sym.solveset(df,A, sym.Interval(0, sym.pi))

它给了我,那个

Complement(ConditionSet(_R, Eq((-l + r*sin(_R))**2*(l + r*sin(_R))**2*(l**4*cos(_R + asin(r*sin(_R)/l))**2 - 2*l**2*r**2*sin(_R)**2*cos(_R + asin(r*sin(_R)/l))**2 + 2*l**2*r**2*sin(_R)*sin(_R + asin(r*sin(_R)/l))*cos(_R)*cos(_R + asin(r*sin(_R)/l)) - l**2*r**2*cos(_R)**2*cos(_R + asin(r*sin(_R)/l))**2 + r**4*sin(_R)**4*cos(_R + asin(r*sin(_R)/l))**2 - 2*r**4*sin(_R)**3*sin(_R + asin(r*sin(_R)/l))*cos(_R)*cos(_R + asin(r*sin(_R)/l)) + r**4*sin(_R)**2*sin(_R + asin(r*sin(_R)/l))**2*cos(_R)**2 + r**4*sin(_R)**2*cos(_R)**2*cos(_R + asin(r*sin(_R)/l))**2), 0), Interval(0, pi)), Union(Intersection({0}, ImageSet(Lambda(_n, -I*(I*(2*_n*pi + arg(sqrt(-2*l**2 - 2*l*sqrt(l - r)*sqrt(l + r) + r**2))) + log(Abs(sqrt(-2*l*sqrt(l - r)*sqrt(l + r)/r**2 + (-2*l**2 + r**2)/r**2))))), Interval(0, pi))), Intersection({0}, ImageSet(Lambda(_n, -I*(I*(2*_n*pi + arg(sqrt(-2*l**2 + 2*l*sqrt(l - r)*sqrt(l + r) + r**2))) + log(Abs(sqrt(2*l*sqrt(l - r)*sqrt(l + r)/r**2 + (-2*l**2 + r**2)/r**2))))), Interval(0, pi))), Intersection({0}, ImageSet(Lambda(_n, -I*(I*(2*_n*pi + arg(-sqrt(-2*l**2 - 2*l*sqrt(l - r)*sqrt(l + r) + r**2))) + log(Abs(sqrt(-2*l*sqrt(l - r)*sqrt(l + r)/r**2 + (-2*l**2 + r**2)/r**2))))), Interval(0, pi))), Intersection({0}, ImageSet(Lambda(_n, -I*(I*(2*_n*pi + arg(-sqrt(-2*l**2 + 2*l*sqrt(l - r)*sqrt(l + r) + r**2))) + log(Abs(sqrt(2*l*sqrt(l - r)*sqrt(l + r)/r**2 - (2*l**2 - r**2)/r**2))))), Interval(0, pi)))))

我不知道 _n 和 Lambda 是什么?

你能帮我吗?

max sympy solver wolframalpha
1个回答
0
投票
from sympy import *

r, l, A = sym.symbols('r, l, A', positive = 'True')
B= sym.asin(r/l*sym.sin(A))
f = sym.simplify(sym.sin(A+B)/sym.cos(B))
df=sym.simplify(sym.diff(f,A))

# replace r/l with L and expand trig funcs and rewrite in terms of tan
# and then replace tan(A/2) with x

eq=df.subs(r,l*L).factor().expand(trig=True).rewrite(tan).subs(tan(A/2)**2,x)


# take the numerator and factor - it gives 3 terms
# look to see what was being solved

z = list(ordered(eq.as_numer_denom()[0].factor().args))
print(solve(z[0].base,x))
print(solve(z[1].base,x))

# remove the big sqrt expression from z[2]

from sympy.solvers.solvers import unrad
u = unrad(z[2],x)[0] # there is no change of var

# extend z with the new x-containing factors

z[-1:]=collect(u.factor(),L).as_independent(x)[1].args
print(solve(z[2].base,x))

这给出了

x
的 3 个简单解,定义为
tan(A/2)
:

[-1]
[2*L**2 - 2*L*sqrt(L**2 - 1) - 1, 2*L**2 + 2*L*sqrt(L**2 - 1) - 1]
[-1]

z[3]
L**2
中的二次项,并且是
x
中的六阶多项式。对于给定的
L
,很容易获得解决方案,但如果您解决
L**2
,则只能获得隐式解决方案:

>>> [i.n(3) for i in real_roots(z[-1].subs(L,S.Half))]  # r/l = L in [0,1]
[-2.99, -0.335, 0.450, 2.22]

现在根据上述定义解决

A
的问题。

© www.soinside.com 2019 - 2024. All rights reserved.