【问题标题】:(Matlab) Solving equation with different input(Matlab)求解具有不同输入的方程
【发布时间】:2015-04-20 21:17:11
【问题描述】:

我的任务是创建一个 matlab 程序,我正在为该任务搜索“switch”和“if”函数。

并且用户将定义任意两个变量,然后 matlab 将求解另一个。通常情况下,我会使用“if”来说明不同的情况,但方程中变量数量的增加也会增加行数。

更新了演示:

% Mach Number after Shockwaves
M2=sqrt((((gamma-1).*M1.^2)+2)./(2*gamma.*M1.^2-(gamma-1)));

% Temperature Ratio
TR=((2*gamma.*M1.^2-(gamma-1)).*(((gamma-1).*M1.^2)+2))./(((gamma+1)^2).*M1.^2);

% Pressure Ratio
PR=(2*gamma.*M1.^2-(gamma-1))./(gamma+1);

% Density Ratio
rhoR=((gamma+1).*M1.^2)./(((gamma-1).*M1.^2)+2);

%Stagnant Pressure Ratio Before Shockwaves
P0R=(((1+0.2.*M2.^2)./(1+0.2.*M1.^2)).^(1.4/0.1)).*((2*gamma.*M1.^2-(gamma-1))./(gamma+1));

%Stagnant Pressure Ratio After Shockwaves
P1R=((1+0.2.*M2.^2).^(1.4/0.4)).*((2*gamma.*M1.^2-(gamma-1))./(gamma+1));

还有其他选择吗?另外,我校园里运行的matlab没有符号工具箱,所以最好避免它。我现在无计可施,因为我确信有一个简单的解决方案可以解决这种情况。

进一步更新了精确方程: 该程序将能够做到这一点,假设用户输入“TR”和“gamma”,然后Matlab会找到“M1”。这将进一步带入后续方程,我将得到“M2”、“PR”、“rhoR”、“P0R”和“P1R”。另外,我意识到由于Matlab会从上到下阅读,有什么办法可以解决这个问题吗?

【问题讨论】:

  • 添加代码会有所帮助
  • 只需要支持线性方程吗?然后看看mathworks.com/help/matlab/ref/linsolve.html
  • 添加了一个简单的代码来演示我的问题。 @小姐。但是考虑到用户的输入,“linsolve”是否允许 matlab 自动求解变量?
  • 是您唯一需要涵盖的示例方程式吗?如果是,则计算不取决于是否给出xy,或xz,或yzresult = -a-b;您应该在需要的地方提供更多上下文信息等。
  • 您需要称它们为 X、Y、Z 吗?或者它可以被canged?

标签: matlab


【解决方案1】:

正如我们在 cmets 中所写的,如果没有符号工具箱,您尝试做的事情非常复杂且相当不可行。

我写了一个 hacky 解决方案,只考虑这种情况: 给出了 3 个变量中的 2 个{TR, gamma, M1},然后自动计算第三个变量。然后可以使用这 3 个变量来求解剩余的方程。

此解决方案假定您至少 一次 可以访问符号工具箱,但在使用生成的代码时不需要它。 我们首先针对以下每种情况根据符号表达式生成 MATLAB 函数:

  • {TR, gamma} 给定,M1 缺失
  • {TR, M1} 给定,gamma 缺失
  • {gamma, M1} 给定,TR 缺失

这导致要写入 6 个 m 文件,sol_TR.mcond_TR.m 等。

syms gamma M1 TR;
assume(gamma, 'real');
assume(gamma > 0);

assume(M1, 'real');
assume(M1 > 0);

assume(TR, 'real');
assume(TR > 0);

eq = TR ==(((gamma - 1)*M1^2 + 2)*(2*gamma*M1^2 - gamma + 1))/(M1^2*(gamma + 1)^2);

vars = {gamma, M1, TR};
num_vars = size(vars,2);

for i=1:num_vars
    current_var = vars{i};
    [sol, ~, cond] = solve(eq,current_var, 'ReturnConditions', true);
    matlabFunction(sol, 'File', sprintf('sol_%s',char(current_var)),'Vars', vars, 'Optimize', false);
    matlabFunction(cond, 'File', sprintf('cond_%s',char(current_var)),'Vars', vars, 'Optimize', false);
end

然后可以使用这些函数来计算缺失变量:

function [input_vector] = calc_third(varname_1, var_value_1, varname_2, var_value_2)

     varnames = {'gamma', 'M1', 'TR'};
     num_vars = size(varnames,2);
     var_index = 1:num_vars;
     var_name_map = containers.Map(varnames,var_index);

     input_vector = zeros(1,num_vars);
     input_vector(var_index == var_name_map(varname_1)) = var_value_1;
     input_vector(var_index == var_name_map(varname_2)) = var_value_2;

     var_index(var_index == var_name_map(varname_1)) = [];
     var_index(var_index == var_name_map(varname_2)) = [];

     sol_func = sprintf('sol_%s(input_vector(1),input_vector(2),input_vector(3))', varnames{var_index});
     cond_func = sprintf('cond_%s(input_vector(1),input_vector(2),input_vector(3))', varnames{var_index});
     result = dot(eval(sol_func), eval(cond_func));

     input_vector(var_index)= result;
end

示例运行:

>> calc_third('gamma', 0.5, 'TR', 100) 

ans =

     0.5000    0.0669  100.0000

您当然可以在该解决方案的基础上创建一个符号系统,其中包含所有 8 个变量。然后,您必须生成 28 函数并根据给定的输入变量选择合适的函数。


但是,我不推荐这条路线。尝试将符号工具箱放在您需要的地方,这应该可以帮助您避免很多麻烦。 你可以像这样使用它:

function [] = calc_third(varname_1, var_value_1, varname_2, var_value_2)

    gamma = sym('gamma');
    M1 = sym('M1');
    TR = sym('TR');

    eq = TR ==(((gamma - 1)*M1^2 + 2)*(2*gamma*M1^2 - gamma + 1))/(M1^2*(gamma + 1)^2);

    subs_eq = (subs(eq,[sym(varname_1), sym(varname_2)],[var_value_1,var_value_2]));

    missing_var = symvar(subs_eq)

    solve(subs_eq,missing_var)

end

示例运行:

>> calc_third('gamma', 0.5, 'TR', 100)

missing_var =

M1

ans =

(2*2^(1/2))/(3*88609^(1/2) + 893)^(1/2)

【讨论】:

  • 我真的应该推动我的大学升级。符号工具箱的方法有何不同?更具体地说,在我将变量TRM1gamma 设为符号后,在用户输入变量后,我将如何让 matlab 知道求解剩余变量。
  • @Jethro:我已经更新了我的答案,MATLAB 将如何替换已知值并解决缺失的值。
  • 谢谢! Matlab符号工具箱是否默认以方程式而不是值来表示答案?
  • 符号工具箱尽可能不使用数值解。您可以使用eval(solve(...)) 将结果转换为浮点数。
  • 我设法获得了一个带有符号工具箱的 matlab,但它给出了这样的错误:Warning: List of equation is empty.ans = [empty sym]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多