matlab 利用渐近性求解三角方程组

xa9qqrwz  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(184)

我把优化一辆支持链接的摩托车的一系列方程放到了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?
有人能帮我吗?

xtfmy6hx

xtfmy6hx1#

Oscar的回答是“正确的”,但由于您是新手,所以有几件事是您想知道的。
首先,在MatLab中,您使用的是sindcosd,它们需要以度为单位的Angular 。另一方面,mathnumpysympy模块暴露的三角函数要求Angular 为弧度。因此,我们需要将Lb, Lm, ...转换为弧度。
注意:因为我不知道您要解决的是哪种问题,所以我对每个数字都应用了m.radians。这可能是错误的:您必须修复它!
一旦我们完成了这一点,我们就可以使用nsolve通过提供初始猜测来数值求解方程组。

import math as m
import sympy as sym
from sympy import sin, cos, lambdify, nsolve, Add

sym.init_printing()
phi,o = sym.symbols('phi,o')

Lb = m.radians(145.0)
Lm = m.radians(320.0)
IPS= m.radians(16.03)
Pivot= m.radians(-20.0)
R1x=m.radians(-46.72)-((Pivot)*m.sin(IPS))
R1y=m.radians(180.26)-((Pivot)*m.cos(IPS))
R_1x=m.radians(-43.52)-((Pivot)*m.sin(IPS))
R_1y=m.radians(-151.37)-((Pivot)*m.cos(IPS))
R4=m.radians(60.0)
R3=m.radians(203.727)
Ip=m.radians(100.1)
eta=m.radians(36.79)
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(nsolve([f, g], [phi, o], [0, 0]))
# out: Matrix([[0.560675440923978], [-0.0993239452750302]])

由于您要解决的是优化问题,而方程又是非线性的,因此很可能存在多个解。我们可以创建这两个方程的等高线图:等高线之间的交点表示解:

# convert symbolic expression to numerical functions for evaluation
fn = lambdify([phi, o], f.rewrite(Add))
gn = lambdify([phi, o], g.rewrite(Add))

# plot the 0-level contour of fn and gn: the intersection between
# the curves are the solutions you are looking for
import numpy as np
import matplotlib.pyplot as plt
pp, oo = np.mgrid[0:2*np.pi:100j, 0:2*np.pi:100j]
fig, ax = plt.subplots()
ax.contour(pp, oo, fn(pp, oo), levels=[0], cmap="Greens_r")
ax.contour(pp, oo, gn(pp, oo), levels=[0], cmap="winter")
ax.set_xlabel("phi [rad]")
ax.set_ylabel("o [rad]")
plt.show()

从这张图中,您可以看到有两种解决方案。我们可以通过向nsolve提供更好的初始猜测来找到另一个解决方案:

print(nsolve([f, g], [phi, o], [0.5, 3]))
# out: Matrix([[0.451286281041857], [2.54087384334971]])
kt06eoxx

kt06eoxx2#

您可以使用SymPy的nsolve进行初步猜测:

In [7]: sym.nsolve([f, g], [phi, o], [0, 0])
Out[7]: 
⎡0.228868116194702⎤
⎢                 ⎥
⎣0.345540167046199⎦

相关问题