Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: XX_CİHAN_XX - 27 Temmuz 2015, 10:22:20

Başlık: Trigonometrik işlem sonuçları neden yanlış çıkıyor.
Gönderen: XX_CİHAN_XX - 27 Temmuz 2015, 10:22:20
Aşağıdaki ön değerleri belirtilen formüle girdiğimde c programım ile Web sitenin (http://www.giangrandi.ch/electronics/satcalc/satcalc.shtml) verdiği sonuçlar uyuşmuyor. Hata nerede olabilir.

lonrx = 29.007959
latrx = 41.042160
longSat = 42.0
R0 = 6370, H = 35800
(http://www.giangrandi.ch/electronics/satcalc/az.png)
(http://www.giangrandi.ch/electronics/satcalc/el.png)

Kodlar:

   azAngle = atan(tan(lonrx-longSat)/sin(latrx)) + 180;
   elAngle = atan(((cos(latrx)*cos(lonrx-longSat)) - (float)(R0/(R0+H))) / sqrt(1-pow((cos(latrx)*cos(lonrx-longSat)),2)));

Başlık: Ynt: Trigonometrik işlem sonuçları neden yanlış çıkıyor.
Gönderen: z - 27 Temmuz 2015, 11:56:18
Radyan ve derece sorunudur.
Başlık: Ynt: Trigonometrik işlem sonuçları neden yanlış çıkıyor.
Gönderen: ferdem - 27 Temmuz 2015, 12:04:38
Hata trigonometrik fonksiyonların kullandığı birimde olabilir.
C kütüphanesinden kullandığınız fonksiyonlar radyan mı bekliyor derece mi? Varsayılan radyandır. Verdiğiniz site derece üzerinden gitmiş, tüm dereceleri radyana çevirip verin fonksiyonlara. Ters trigonometrik fonksiyonların, atan, çıkışları da radyan cinsinden olacaktır, onları da dereceye çevirip sonuca bakın.
Başlık: Ynt: Trigonometrik işlem sonuçları neden yanlış çıkıyor.
Gönderen: XX_CİHAN_XX - 27 Temmuz 2015, 12:13:42
Evet dediğiniz gibi oldu.
örneğin x derecenin tanjantı için
tan(x*(pi/180));
arctan için de
atan(x)*(180/pi);
derece ve radyant uyumluluğunu sağlamak gerekiyordu. Teşekkürler.

Farkı incelemek isteyenler için olması gereken formül şöyle:


    #define TORAD  (3.14159265 / 180.0)
    #define TODEG  (180.0 / 3.14159265)
    azAngle = atan((tan((lon-longSat)*TORAD))/sin(lat*TORAD))*TODEG + 180;
    elAngle = atan((cos(lat*TORAD)*cos((lon-longSat)*TORAD) - (R0/(R0+H))) / sqrt(1-pow((cos(lat*TORAD)*cos((lon-longSat)*TORAD)),2)))*TODEG;
Başlık: Ynt: Trigonometrik işlem sonuçları neden yanlış çıkıyor.
Gönderen: CLR - 27 Temmuz 2015, 12:19:18
Sitenin kullandığı hesaplama yöntemi sayfanın içinde de varmış zaten


// This function will calculate antenna azimuth and elevation from receiver
// coordinates and satellite longitude. Called by the "Calculate" button.
function cmd_calculate()
{
    var rx_lon, rx_lat, sat_lon, rx_az, rx_el;
    var delta_lon, num, den;                                 // Temporary values
    var R0 = 6370;                                         // Earth's radius: 6370 km
    var h = 35800;                                         // Satellite height: 35800 km

    rx_lon = parseFloat(document.getElementById('rx_lon').value);
    if (isNaN(rx_lon) || (rx_lon < -180) || (rx_lon > 180))
    {
        document.getElementById('rx_lon').value = "";
        window.alert("Please enter the longitude of the receiver\n(decimal format, positive = east, negative = west,\nvalid values between -180 and 180 degrees).");
        return(1);
    }
    rx_lat = parseFloat(document.getElementById('rx_lat').value);
    if (isNaN(rx_lat) || (rx_lat < -90) || (rx_lat > 90))
    {
        document.getElementById('rx_lat').value = "";
        window.alert("Please enter the latitude of the receiver\n(decimal format, positive = north, negative = south,\nvalid values between -90 and 90 degrees).");
        return(1);
    }
    sat_lon = parseFloat(document.getElementById('sat_lon').value);
    if (isNaN(sat_lon) || (sat_lon < -180) || (sat_lon > 180))
    {
        document.getElementById('sat_lon').value = "";
        window.alert("Please enter the longitude of the satellite\n(decimal format, positive = east, negative = west,\nvalid values between -180 and 180 degrees).");
        return(1);
    }

    delta_lon = rx_lon - sat_lon;
    rx_az = Math.atan((Math.tan((Math.PI/180)*delta_lon)/Math.sin((Math.PI/180)*rx_lat)))*(180/Math.PI)+180;
    num = Math.cos(rx_lat*(Math.PI/180))*Math.cos(delta_lon*(Math.PI/180))-R0/(R0+h);
    den = Math.sqrt(1-Math.pow(Math.cos(rx_lat*(Math.PI/180))*Math.cos(delta_lon*(Math.PI/180)),2));
    rx_el = (180/Math.PI)*Math.atan(num/den);

    document.getElementById('rx_az').value = rx_az.toPrecision(4);
    document.getElementById('rx_el').value = rx_el.toPrecision(3);
    return(0);
}