Trigonometrik işlem sonuçları neden yanlış çıkıyor.

Başlatan XX_CİHAN_XX, 27 Temmuz 2015, 10:22:20

XX_CİHAN_XX

Aşağıdaki ön değerleri belirtilen formüle girdiğimde c programım ile Web sitenin verdiği sonuçlar uyuşmuyor. Hata nerede olabilir.

lonrx = 29.007959
latrx = 41.042160
longSat = 42.0
R0 = 6370, H = 35800



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)));

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ferdem

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.

XX_CİHAN_XX

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;
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

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);
}
Knowledge and Experience are Power