【问题标题】:Solving for a variable in matlab在matlab中求解一个变量
【发布时间】:2015-07-23 18:05:16
【问题描述】:

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

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

【问题讨论】:

  • 你想用符号数学来解决数字吗? eha 是什么?
  • 抱歉,我忘记将 e、h 和 a 放入输入参数中。它们只是数字。电荷、高度和初始角度。
  • 我想用数字解决它。
  • 如果你想用数字来做,那么你应该使用fsolve
  • 好的,但我还是有同样的问题。

标签: matlab equation-solving


【解决方案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

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

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

【讨论】:

  • 我不确定您所说的“首先将您的函数重写为一个表达式,该表达式返回您的函数对于 [V1, V2]。例如“我必须猜测 V1 和 V2 吗?我需要一个初始 V0 吗?有两个方程和两个未知数,所以我似乎不必为 V1 和 V2 设置任何初始条件。
  • 欢迎来到数值计算。如果您想使用fsolve 中的任何算法,这可能是理想的起点,您需要提供初步猜测。如果您难以找到合理的初始猜测(在您能够从这些初始条件中获得解决方案的意义上是合理的),那么还有其他方法可能会有所帮助。
  • 如果我要手动执行此操作,我会使用泰勒多项式来逼近三角函数并以这种方式求解 V1 和 V2。我可以让 Matlab 做类似的事情吗?
  • 另外,如果我要使用您在回答中建议的方式,那么 V 又是什么?我知道 V0 是一个初始值。
  • fsolve 一起,MATLAB 将构建函数范数的近似二次局部模型,然后选择使用信任域或线搜索回溯算法最小化该范数的步骤。如果您在 Wikipedia 中查找 Levenberg-Marquardt 和信任区域优化,您可以找到更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多