在matlab中求解一个变量

在matlab中求解一个变量,matlab,equation-solving,Matlab,Equation Solving,我有一个由两个方程组成的系统,我需要Matlab来求解某个变量。问题是我需要的变量在表达式和trig函数中。我编写了以下代码: function [ V1, V2 ] = find_voltages( w1, l1, d, w2, G1, G2, m, v, e, h, a, x) k1 = sqrt((2*V1*e)/(G1^2*m*v^2)); k2 = sqrt((2*V2*e)/(G2^2*m*v^2)); A = h + l1*a; b = -A*k1*sin(k1*w1) + a

我有一个由两个方程组成的系统,我需要Matlab来求解某个变量。问题是我需要的变量在表达式和trig函数中。我编写了以下代码:

function [ V1, V2 ] = find_voltages( w1, l1, d, w2, G1, G2, m, v, e, h, a, x)

k1 = sqrt((2*V1*e)/(G1^2*m*v^2));
k2 = sqrt((2*V2*e)/(G2^2*m*v^2));

A = h + l1*a;
b = -A*k1*sin(k1*w1) + a*cos(k1*w1);
B = A*cos(k1*w1) + (a/k1)*sin(k1*w1);
C = B + a*b;
c = C*k2*sinh(k2*w2) + b*cosh(k2*w2);
D = C*cosh(k2*w2) + (b/k2)*sinh(k2*w2);

bd = A*k1*sinh(k1*w1) + a*cosh(k1*w1);
Bd = A*cosh(k1*w1) + (a/k1)*sinh(k1*w1);
Cd = Bd + a*bd;
cd = -Cd*k2*sin(k2*w2) + bd*cos(k2*w2);
Dd = Cd*cos(k2*w2) + (bd/k2)*sin(k2*w2);

fsolve([c*(x-(l1+w1+d+w2)) + D == 0, cd*(x-(l1+w1+d+w2)) + Dd == 0], [V1,V2])

end
由于未定义V1和V2,因此出现错误。它们是表达式的一部分,需要为其求解。有办法做到这一点吗?还有,我作为参数来求解的函数是它们上面较小方程的集合,这是一个问题吗

Valid values: 
Drift space 1 (l1): 0.11
Quad 1 length (w1): 0.11
Quad 2 length (w2): 0.048
Separation (d): 0.014
Radius of Separation 1 (G1):    0.016
Radius of Separation 2 (G2):    0.01
Voltage 1 (V1): -588.5
Voltage 2 (V2): 418
Kinetic Energy in eV:   15000
Mass (m)    9.109E-31
Kinetic Energy in Joules (K):   2.4E-15
Velocity (v):   72591415.94
Charge on an Electron (e):  1.602E-19

k1^2=(2*V1*e)/(G1^2*m*v^2): 153.4467773
k2^2=(2*V2*e)/(G2^2*m*v^2): 279.015

首先,以表达式的形式重新编写函数,该表达式返回函数在[V1,V2]的有效猜测中失败的程度。例如:

function gap = voltage_eqn(V, w1, l1, d, w2, G1, G2, m, v, e, h, a, x)
    V1 = V(1) ;
    V2 = V(2) ;

    k1 = sqrt((2*V1*e)/(G1^2*m*v^2));
    k2 = sqrt((2*V2*e)/(G2^2*m*v^2));

    A = h + l1*a;
    b = -A*k1*sin(k1*w1) + a*cos(k1*w1);
    B = A*cos(k1*w1) + (a/k1)*sin(k1*w1);
    C = B + a*b;
    c = C*k2*sinh(k2*w2) + b*cosh(k2*w2);
    D = C*cosh(k2*w2) + (b/k2)*sinh(k2*w2);

    bd = A*k1*sinh(k1*w1) + a*cosh(k1*w1);
    Bd = A*cosh(k1*w1) + (a/k1)*sinh(k1*w1);
    Cd = Bd + a*bd;
    cd = -Cd*k2*sin(k2*w2) + bd*cos(k2*w2);
    Dd = Cd*cos(k2*w2) + (bd/k2)*sin(k2*w2);

    gap(2) = c*(x-(l1+w1+d+w2)) + D ;
    gap(1) = cd*(x-(l1+w1+d+w2)) + Dd ;

end
然后从一些初始的
V0
调用
fsolve

Vf = fsolve(@(V) voltage_eqn(V,  w1, l1, d, w2, G1, G2, q, m, v, e, h, a, x), V0) ;

是否要使用符号数学以数字顺序求解?什么是
e
h
a
?对不起,我忘了在输入参数中输入e、h和a。它们只是数字。电荷、高度和初始角度。我想用数字来解决它。如果你想用数字来解决它,那么你应该使用
fsolve
。好吧,但我仍然有同样的问题。我不确定你所说的“首先,把你的函数重新写成一个表达式,它返回你函数的范围。”未能保持对[V1,V2]的某些有效猜测。例如“我必须猜测V1和V2吗?”?我需要一个初始V0?有两个方程和两个未知数,所以我似乎不需要为V1和V2设置任何初始条件。欢迎使用数值计算。如果您想使用
fsolve
中的任何算法,这可能是一个理想的起点,您需要提供一个初始猜测。如果你很难找到合理的初始猜测(合理的意思是你能从那些初始条件中得到一个解),那么还有其他方法可能会有帮助。如果我手工做这件事,我会使用泰勒多项式来近似三角函数,并以这种方式解V1和V2。我可以让Matlab做一些类似的事情吗?如果我要用你在答案中建议的方法,那么V又是什么?我知道V0是一个初始值。使用
fsolve
MATLAB将构建函数范数的近似二次局部模型,然后使用信赖域或线搜索回溯算法选择步骤最小化该范数。如果你在维基百科中查找Levenberg Marquardt和信赖域优化,你可以找到更多信息。