#c
#c
Вопрос:
Я пытаюсь создать схему взвешенного луча Тейлора из его уравнений в книге. Все вычисляется правильно до определенной точки, но значения для значения Тейлора повторно используются вместо пересчета. Это то, что у меня есть:
#include <math.h>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
int main ()
{
double sidelobeRatio, nbar, zeros, wave, length;
cout << "Please enter side lobe ratio, nbar, number of zeros less than or equal to nbar, the wavelength and length of the array." << endl;
cin >> sidelobeRatio >> nbar >> zeros >> wave >> length;
vector<double> DbValues;
double taylorA = 1/M_PI * acosh(pow(10,sidelobeRatio/20)); //Calculates the value of A for sigma and Zn (step 1b)
double sigma = nbar/pow(pow(taylorA,2) pow((nbar-0.5),2),0.5); //Calculates the sigma constant for taylor weighting (step 2)
double Zn = sigma * pow(pow(taylorA,2) pow((zeros-.5),2),(0.5)); //The Zn constant for taylor weighting (step 3)
for (double u=-90; u<=90; u=u 45)
{
double z = (sin(u*M_PI/180)*length) / wave; //Calculates z for taylor weighting constant (step 1a)
double taylorSine = sin(M_PI*z)/(M_PI*z); //The sinc function for beamforming (step 4a)
cout << taylorSine << " this is taylor sine" << endl;
double taylorNumerator = 1-pow((z/Zn),2); //The numerator for the taylor weight constant (step 4b)
cout << taylorNumerator << " this is numerator" << endl;
double newValue = 1;
vector<double> newValues;
for (int zeros=1; zeros <= nbar-1; zeros )
{
double taylorDenom = 1-pow((z/zeros),2); //The denomenator for the taylor weight constant (step 4c)
double taylorValue = taylorSine*(taylorNumerator/taylorDenom); //The taylor equation with capital pi operand (step 5)
newValue *= taylorValue;
newValues.push_back(newValue);
cout << taylorValue << " this is taylorValue" << endl;
}
int i;
for (i=0; i < newValues.size(); i )
{
double convert = 10*log10(pow(newValues[i],2)); //converts F from linear to Db (step 6)
DbValues.push_back(convert);
}
double j;
for (j=0; j < DbValues.size(); j )
{
cout << DbValues[j] <<endl;
}
cout << DbValues.size() << " this is DbValue" << endl;
cout << newValues.size() << " this is newValue" << endl;
}
return 0;
};
выводит:
-3.89817e-17 this is taylor sine
-3 this is numerator
-1.18126e-18 this is taylorValue
-4.87271e-18 this is taylorValue
-1.1566e-17 this is taylorValue
-2.22753e-17 this is taylorValue
-358.553
-704.798
-1043.53
-1376.58
4 this is DbValue
4 this is newValue
-nan this is taylor sine
1 this is numerator
-nan this is taylorValue
-nan this is taylorValue
-nan this is taylorValue
-nan this is taylorValue
-358.553
-704.798
-1043.53
-1376.58
-nan
-nan
-nan
-nan
8 this is DbValue
4 this is newValue
-3.89817e-17 this is taylor sine
-3 this is numerator
-1.18126e-18 this is taylorValue
-4.87271e-18 this is taylorValue
-1.1566e-17 this is taylorValue
-2.22753e-17 this is taylorValue
-358.553
-704.798
-1043.53
-1376.58
-nan
-nan
-nan
-nan
-358.553
-704.798
-1043.53
-1376.58
12 this is DbValue
4 this is newValue
ожидаемые результаты:
введите описание изображения здесь
Для каждого нового вычисляемого z необходимо вычислить новое значение Тейлора, но по какой-то причине я получаю одни и те же значения Тейлора снова и снова. Если что-то нуждается в дополнительных разъяснениях, пожалуйста, дайте мне знать.
Уточнение: когда u = 90 градусов, если пользователь вводит nbar, равный 5, значение Тейлора необходимо вычислить 5 раз, при этом z и n переходят от 1 к nbar-1. Этого не происходит, возможно, необходимо ввести цикл while?
Я напечатал sigma, Zn и taylorA, и они вычисляются правильно. Распечатки размера в конце всегда правильные. Значения в них не являются.
входные данные: Соотношение: 30 нбар: 5 нулей: 5 длина волны: .1 длина: 1
Комментарии:
1. пожалуйста, укажите ввод, вывод и ожидаемый результат. Просто предположение: возможно ли, что, начиная с определенного момента, вычисление
taylorDenom
переполнений? Вы проверяли значенияtaylorDenom
иtaylorValue
перед вычислением продукта?2. Когда я помещаю ожидаемые входные данные, он помещает все это в одну строку, и это сливается воедино.
3.-336.5660 -124.7323 -112.6910 -105.6473 -100.6497 -96.7732 -93.6059 -90.9278 -88.6080 -86.5617 -84.7313 -83.0753 -81.5636 -80.1729 -78.8852 -77.6864 -76.5650 -75.5116 -74.5183 -73.5788 -72.6874 -71.8395 -71.0310
4. Это несколько ожидаемых результатов. Это было сделано в Excel, и его значение шага u = u 0.1 вместо 90, как у меня. У меня есть 90, чтобы уменьшить количество точек данных для меня сейчас. Excel переходит от -330 к 0 и обратно к -330. Мой только увеличивается
5.
for (double u = -90; u <= 90; u = u 45)
циклы-90, -45, 0, 45, 90
. Гдеz = sin (u * M_PI / 180.) ...
будет0
при0
созданииtaylorSine = sin(M_PI*z)/(M_PI*z);
inf
, если поймано исключение с плавающей запятой. Затемdouble taylorDenom = 1-pow((z/zeros),2);
происходит0
взрыв(taylorNumerator / taylorDenom)
. Кроме того,zeros
вdouble sidelobeRatio, nbar, zeros...
конфликтует сfor (int zeros = 1; zeros <= nbar - 1; zeros )
тем, что второйint zeros
затеняет оригинал. Вероятно, также есть проблемы с вашими уравнениями.
Ответ №1:
удалите int i; и поместите его внутрь цикла.
for (int i=0; i < newValues.size(); i )
{
double convert = 10*log10(pow(newValues[i],2)); //converts F from linear to Db (step 6)
DbValues.push_back(convert);
}