在matlab中求解变量

时间:2015-07-23 18:05:17

标签: 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*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

1 个答案:

答案 0 :(得分:1)

首先将您的函数重写为一个表达式,该表达式返回您的函数无法保持的范围,以便对[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

然后从最初的fsolve

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