Matlab 到 C++ 的翻译
Posted
技术标签:
【中文标题】Matlab 到 C++ 的翻译【英文标题】:Matlab to C++ Translation 【发布时间】:2018-12-06 14:22:57 【问题描述】:我最近开始了我的 C++ 之旅,除了基础知识外,我对它知之甚少。我正在尝试将我的 Matlab 代码翻译成 C++,以帮助我理解两者之间的差异。 Matlab 代码采用给定的输入 X(height),并计算输入的密度 (rho) 和声速 (acousticSpeed)。
这是 Matlab 代码。
function [rho, acousticSpeed] = atmos(X)
%only valid to X = 11Km
%Constants
gamma=1.4;
R=287.05;
g=9.81;
To=288.15;
Po=101325;
zo=50;
L=-0.0065;
%Temperature Calculation
T=To+(L*(X-zo));
%Pressure Calculation
P=Po*(T/To)^(-g/(L*R));
%Density Calculation
rho=P/(R*T);
%Acoustic Speed
acousticSpeed=sqrt(gamma*R*T)
end
根据我对 C++ 的了解,函数不能返回多个值(或者至少,这是一个非常密集的过程)。这个 Matlab 函数返回两个值,rho 和声学速度。目前,我在 C++ 上将其拆分为 2 个函数,以使用相关方程计算每个单独的输出。
对于 Rho 我有
rho(double x)
double zo;
double To;
double Po;
double L;
double g;
double R;
double p;
zo = 50;
To = 288.15;
Po = 101325;
L = -0.0065;
g = -9.81;
R = 287.05;
double T = To + L*(x-zo);
double P = pow((Po*(T/To)), -(g*(L*R)));
p = P/(R*T);
return p;
对于音速我有
soundspeed(double x)
double zo;
double To;
double L;
double R;
double as;
double gamma;
zo = 0;
To = 288.15;
L = -0.0065;
R = 287.05;
gamma = 1.4;
double T = To + L*(x-zo);
as = pow(gamma*R*T,0.5);
return as;
我的主要功能是
int main()
cout << "Please enter a desired altitude in meters." << endl;
double x;
double A;
double B;
cin>> x;
A = soundspeed(x);
B = rho(x);
cout << "For Altitude: " << x << " meters" << endl;
cout << "Speed of Sound: " << A << " meters per second." << " Air Density:
" << B;
return 0;
对于 500 米的输入,声速为每秒 338 米,密度约为 1.225。 声速函数返回正确值,但密度函数返回0。
我已经包含了 iostream 和 math.h(用于 pow() 函数)。
我做错了什么?有没有更简洁的方法可以将此 Matlab 函数转换为 C++?作为初学者,您有经验的人可以给我任何其他提示吗?谢谢。 抱歉,我不确定如何包含所有信息。
【问题讨论】:
第一件事是您将变量声明为旧式 C。在需要的范围内声明变量。 函数只能返回一个值,尽管声明一个包含多个值的结构是最简单的,例如struct two_values int value1; int value2;;
,你可以毫不费力地返回
不是问题:pow
似乎是计算幂的通用函数,尽管在某些情况下pow
不是最好的(例如,对于整数)。也许pow
会做同样的事情,但对于平方根,我还是宁愿使用std::sqrt。
@MatthieuBrucher 是的it was the case in C89。作为一个奇怪的好奇心,我发现了this,它有一个关于在 c 中声明变量的提示,我不敢在这里引用;)
您可以通过为所有参数定义struct
、设置它们的值并将其用作函数的输入变量来避免此类问题
【参考方案1】:
问题在于括号和值的位置,特别是在压力计算中。 原来是
double P = pow((Po*(T/To)), -(g*(L*R)));
但是正确的方程式是
double P = Po*pow((T/To), -(g/(L*R)));
一个简单的解决方案,我应该在发布之前尝试过,因为我不想浪费任何人的时间。
感谢大家的帮助!
【讨论】:
以上是关于Matlab 到 C++ 的翻译的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB 到 C++:MATLAB Coder 不支持 csvread()