Matlab到C++翻译

3

我最近开始学习C++,除了基础知识外几乎没有其他了解。我试图将我的Matlab代码翻译成C++,以帮助我了解两者之间的区别。Matlab代码接受给定输入X(高度),并计算输入的密度(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和acousticSpeed。现在,我已经将其拆分为两个在C++中的函数,用相关的方程计算每个单独的输出。

对于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++吗?作为一个初学者,你有什么其他的建议可以给我吗?谢谢。
抱歉长度有些长,我不确定怎样才能包含所有信息。

1
首先,你正在声明你的变量为旧式C语言。在需要它们的作用域内声明变量。 - Matthieu Brucher
1
不是问题:pow 看起来像是计算幂的通用函数,但在某些情况下 pow 并不是最好的选择(例如对于整数)。也许 pow 可以做到同样的效果,但对于平方根,我更愿意使用 std::sqrt - 463035818_is_not_a_number
1
@MatthieuBrucher 是的,在C89中是这样的。作为一个奇怪的好奇心,我发现了这个,其中有一个关于在C语言中声明变量的提示,我不敢在这里引用 ;) - 463035818_is_not_a_number
1
通过为所有参数定义一个“结构体”,设置它们的值,并将其用作函数的输入变量,您将避免这种问题。 - Damien
1
各位听众,我不同意关闭问题的理由,因为这个问题有一个最小可复现示例(MCVE),它清楚地说明了输入、输出和期望输出。通常关于代码翻译的问题,只需要提供一种语言的代码,并期望其他语言的代码作为答案,在这个意义上,我认为这个问题是一个积极的例子。 - 463035818_is_not_a_number
显示剩余5条评论
1个回答

3
问题出在括号和数值的位置上,尤其是在压力计算中。原始的内容为:
double P = pow((Po*(T/To)), -(g*(L*R)));

然而,正确的方程式是

double P = Po*pow((T/To), -(g/(L*R)));

在发布之前,我应该尝试过的一个简单解决方案,因为我不想浪费任何人的时间。

感谢大家的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接