我把优化一辆支持链接的摩托车的一系列方程放到了matlab中,我要把它变成python代码,因为我需要把它加载到另一个软件中。MatLab代码如下:
clc
clear
Lmono= 320;
Lbielletta=145;
IPS= 16.03;
Pivot= -20;
R1x=(-46.72)-((Pivot)*sind(IPS));
R1y=((180.26)-((Pivot)*cosd(IPS)));
R_1x=(-43.52)-((Pivot)*sind(IPS));
R_1y=((-151.37)-((Pivot)*cosd(IPS)));
R4=60;
R3=203.727;
Ip=100.1;
eta=36.79;
syms phi o
eqns = [(Lbielletta)^2 == ((R3*cosd(phi)-R4*sind(o)+R_1x)^2)+((-R3*sind(phi)-R4*cosd(o)-R_1y)^2)
(Lmono)^2 == ((((R3*cosd(phi))-(R4*sind(o))-((Ip*cosd(eta+o)))+(R1x))^2) + (((R3*sind(phi))+(R4*cosd(o))-((Ip*sind(eta+o)))+(R1y))^2))];
[phi ,o]=vpasolve(eqns,[phi o]);
我用PYTHON写道:
import math as m
Lb = 145.0
Lm = 320.0
IPS= 16.03;
Pivot= -20.0;
R1x=(-46.72)-((Pivot)*m.sin(IPS))
R1y=((180.26)-((Pivot)*m.cos(IPS)))
R_1x=(-43.52)-((Pivot)*m.sin(IPS))
R_1y=((-151.37)-((Pivot)*m.cos(IPS)))
R4=60.0
R3=203.727
Ip=100.1
eta=36.79
import sympy as sym
from sympy import sin, cos
sym.init_printing()
phi,o = sym.symbols('phi,o')
f = sym.Eq(((R3*cos(phi)-R4*sin(o)+R_1x)**2)+((-R3*sin(phi)-R4*cos(o)-R_1y)**2),Lb**2)
g = sym.Eq(((((R3*cos(phi))-(R4*sin(o))-((Ip*cos(eta+o)))+(R1x))**2) + (((R3*sin(phi))+(R4*cos(o))-((Ip*sin(eta+o)))+(R1y))**2)),Lm**2)
print(sym.nonlinsolve([f,g],(phi,o)))
但当我运行它加载的代码大约30秒(在MatLab中需要1-2秒),然后返回以下代码:
runfile('C:/Users/Administrator/.spyder-py3/temp.py', wdir='C:/Users/Administrator/.spyder-py3')
EmptySet
Emptyset?
有人能帮我吗?
2条答案
按热度按时间xtfmy6hx1#
Oscar的回答是“正确的”,但由于您是新手,所以有几件事是您想知道的。
首先,在MatLab中,您使用的是
sind
和cosd
,它们需要以度为单位的Angular 。另一方面,math
、numpy
、sympy
模块暴露的三角函数要求Angular 为弧度。因此,我们需要将Lb, Lm, ...
转换为弧度。注意:因为我不知道您要解决的是哪种问题,所以我对每个数字都应用了
m.radians
。这可能是错误的:您必须修复它!一旦我们完成了这一点,我们就可以使用
nsolve
通过提供初始猜测来数值求解方程组。由于您要解决的是优化问题,而方程又是非线性的,因此很可能存在多个解。我们可以创建这两个方程的等高线图:等高线之间的交点表示解:
从这张图中,您可以看到有两种解决方案。我们可以通过向
nsolve
提供更好的初始猜测来找到另一个解决方案:kt06eoxx2#
您可以使用SymPy的
nsolve
进行初步猜测: