نشاط : كتابة الخوازمية التي تقوم بحساب الـــــــ (cos(x

  • oussama_oux

الهدف هو كتابة الخوارزمية التي تقوم بحساب (cox(x لزاوية ما بالدرجة دون إستخدام الدالة المدرجة مسبقا في أي لغة برمجة.

الصورة التالية توضح كيف يمكن حساب (cos( x بعلاقة رياضية بسيطة :

يمكنك تنفيذها بأي لغة برمجة تحب

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

تسمى هذه الطريقة باسم متسلسلة تايلور

صحيح و يمكن تمثيل أي دالة على شكل كثير حدود حتى الجذر

أتذكر أني قمت بكتابة هذا الالغوريتم من قبل

لكن يجب انت تضع شرط للتوقف الـ loop

مثلا عندما يصبح x^n/n! f اصغر من 0.00001 :p

oussama_oux أضف ردا

وضعت شرط التوقف لما n=42

مشاركتي بإستخدام جافاسكريبت

وقمت بعمل مقارنة فوجدت فرق الخطأ 0 تقريبا

var anglec = prompt("أدخل الزاوية بالدرجة لحساب cos ");

function oux(angled) {
  var angle = angled * (Math.PI / 180),
    a = 0,
    b = 0,
    c = 0,
    d = 0,
    e = 0;
  var f = [];

  function factorial(n) {
    if (n === 0 || n == 1)
      return 1;
    if (f[n] > 0)
      return f[n];
    return f[n] = factorial(n - 1) * n;
  }


  var i1 = 0,
    n1 = 2;
  while (i1 < 10) {
    a = a + (Math.pow(angle, n1) / factorial(n1));
    n1 = n1 + 4;
    i1++;
  }
  var i2 = 0,
    n2 = 4;
  while (i2 < 10) {
    b = b + (Math.pow(angle, n2) / factorial(n2));
    n2 = n2 + 4;
    i2++;
  }
  return c = 1 + (a * -1) + b;
}
d = Math.cos(anglec * (Math.PI / 180));
e = d - oux(anglec);
alert("cos(" + anglec + ")= " + oux(anglec) + "\nrealcos(" + anglec + " )= " + d + "\nفرق الخطأ = " + e);
a3f أضف ردا

فرق الخطأ لديك سيزداد طرديا بزيادة الزاوية.

جرب مثلا 36000 كزاوية.

ولا داعي لتخزين كل قيم n! التي سبقت. يكفيك الاحتفاظ بالقيمة الأخيرة.

فرق الخطأ لديك سيزداد طرديا بزيادة الزاوية.

أنت محق لكن من أجل زاوية 360

cos(360)= 1.0000000000000284 

فالزاوية لا تزيد عن 360 فيمكن القول خطأ برتبة 14- رتبة عشرية و كما ذكر الأخ محمد فهذه متسلسة تايلور التي تسمح بتمثيل أي دالة على شكل كثير حدود و أوجدها عالم رياضي تايلور الأنجليزي في عام 1715

فهي تستعمل لحل المسائل المعقدة بشكل تقريبي و شكرا لك

كنت ألفت نظرك أن دالتك تعطي نواتج خاطئة جدا فوق ال 360. ويوجد زوايا فوق ال 360 وتحت الصفر. موجة جيب التمام تستمر لما لا نهاية.

وباماكانك تقليل المساحة المستخدمة بلاستغناء عن مصفوفة n والاكتفاء بأخر عنصر.

أعلم أن الدالة المدرجة لا تستخدم هذه الخوارزمية

إذن ماهي الخوارزمية المستخدمة ؟؟؟؟؟ و هل يمكن محاكاتها ؟

تقصد الدالة المستخدمة في cos الموفرة من قبل النظام؟

لا تستخدم taylor ولكن _مجموعة_ خوارزميات أخرى أكثر تعقيدا.

مثلا هذه هي cos لل glibc:

نعم أقصد ذالك شكرا لك

حقا معقدة جدا و نحن عندما نقوم بحساب cos نظنه سهلا تخيل الأمر دون حواسيب أو دون ألات حاسبة

و هل لديك فكرة كيف كان العرب الذين طوروا علم المثلثات يحسبون cos ؟؟؟؟؟؟

بحثت لم أجد سوى فكرة غامضة حيث كانو يستعملون جداول أو ماشابه!!

كانوا يحاولون الوصول إلى معادلات متعددة الحدود مقاربة للقيم الفعلية. القيم الأصلية سهلة التأكد منها لأنه يمكنك رسم دائرة ذو قطر معين (كلما كان أكبر كان أفضل) ثم مقارنة القياس بالحساب.

ثم يتم إستخدم المعادلة في حساب كل الزوايا بخطوة صغيرة (مثلا 1/100 من الزاوية القائمة) و تدوين ذلك في جداول.

شكرا لك في الحقيقة أنت الوحيد الذي تفاعل مع الموضوع و أثرى النقاش بارك الله فيك و زادك علما