طلب مساعدة عااجلة لو سمحتوا

السلام عليكم ورحمة الله ،،

أحبابي مطلوب مني أحل السؤال هذا عن طريق الماتلاب ، بكتابة خوارزمية وأنا بالأساس هذا بعيد قليلاً عن تخصصي وحاولت لمدة شهر وما قدرت …

نزلت دروس منها أكثر من رائعة وحملت البرنامج ولم أستطع …

أبغى مساعدتكم تبقى لي أيام قليلة للتسليم ،،
وأي استفسار بريدي موجود …

أرجو المساعدة ، والشرح لاحقاً لأني مضطر أقدمه مع الشرح

وعليكم السلام

من المفروض الواجب تحله وحدك ونحن نساعدك في تصحيحه

clear all; close all;clc

% Function
f=inline('exp(x)-3*x');

% Inputs
a=0;                     % Endpoint
b=1;                     % Endpoint
No=50;                   % Max iterations
Tol=0.0001;                 % Tolerance

% Call of our function
[p]=MyBiSection(f,a,b,Tol,No)

والدالة

function [p]=MyBiSection(f,a,b,Tol,N)

% Check if f(a)=0 "a is the root"
if f(a)==0,p=a;return;end

% Check if f(b)=0  "b is the root"
if f(b)==0,p=b;return;end

% Check if f(a)*f(b)<0
if (sign(f(a))==sign(f(b)))
    disp('f(a) and f(b) have the same sign');
    p=NaN;
    return;
end

% Routine
i=1;
Fa=f(a);
while i<=N
   p=(a + b)/2;
   if (f(p)==0 ||(b-a)*0.5<Tol),return,end
   i=i+1;
   if sign(f(a))==sign(f(p))
   Fa=f(p);
   a=p;
   else
   b=p;
   end
end
fprintf('
 Method failed after %d iterations 
',N);
p=NaN;

الله يحفظك أخي ، وأشكرك جزيلاً …

للأسف حاولت كثيراً وقرابة الشهر دون جدوى ،،

تعلمت بعض الأمور في البرنامج وقرأت الكثر عنه ،

ولكن تخصصي تربوي وهذا العمل لمقرر دراسي واحد فقط …

وهو التحليل العددي ، ولازالت لدي الرغبة في تعلمه …

ولكن لضيق الوقت لجأت لمن لأصحاب الخبرة في هذا البرنامج ، ومنتداكم على رأسهم …

رغم ردكم الجميل وكتابة الكود ، لكن إلى الآن لا أعلم كيف أستخدم هذا الكود في البرنامج ؟!!

لو أمكن تدعمني بصورة ع الأقل أو موضوع قديم يفيدني ، لأن المطلوب تقديم الخوارزمية على CD …

  • هل في حال كتابة الكود في البرنامج يقوم بحل المسألة لغاية 50 تكرار ؟!
  • طريقة ظهور بيانات الحل تكون في جدول أو خطوات ؟! لأن المطلوب اظهارها في جداول ؟!

وأكرر شكري وتقديري لتجاوبك السريع ،،

السلام عليكم ورحمة الله …

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

كتبت الكود في برنامج الماتلاب !!

طلعت لي بعض الرسائل الخطأ

ولا أدري ما الخطوة التالية ، ارجو المساعدة ؟!!


[LEFT] 
>> % Function
>> f=inline('exp(x)-3*x');
>> % Inputs
>> a=0;                     % strpoint
>> b=1;                     % Endpoint
>> No=50;                   % Max iterations
>> Tol=0.0001;                 % Tolerance
>> % Call of our function
>> [p]=MyBiSection(f,a,b,Tol,No)
??? Undefined function or method 'MyBiSection' for input arguments of type
'inline'.
 
>> function [p]=MyBiSection(f,a,b,Tol,N)
??? function [p]=MyBiSection(f,a,b,Tol,N)
    |
Error: Function definitions are not permitted in this context.
 
>> % Check if f(a)=0 "a is the root"
>> if f(a)==0,p=a;return;end
>> % Check if f(b)=0  "b is the root"
>> if f(b)==0,p=b;return;end
>> % Check if f(a)*f(b)<0
>> if (sign(f(a))==sign(f(b)))
    disp('f(a) and f(b) have the same sign');
    p=NaN;
    return;
end
>> % Routine
>> i=1;
>> Fa=f(a);
>> while i<=N
   p=(a + b)/2;
   if (f(p)==0 ||(b-a)*0.5<Tol),return,end
   i=i+1;
   if sign(f(a))==sign(f(p))
   Fa=f(p);
   a=p;
   else
   b=p;
   end
end
??? Undefined function or variable 'N'.
 
>> fprintf('
 Method failed after %d iterations 
',N);
??? Undefined function or variable 'N'.
 
>> p=NaN;
>> [/left]

[CENTER]هذه سكريبتات
لا توضع مباشرة في نافذة الاوامر


اولا
اتبع الخطوات في الصورة

الان نقدر نعمل call للدالة لما نحتاجها

ثانيا
اعد نفس الخطوات لكود التجربة
تسمية الملف هذه المرة لا تهم


الدالة سترجع لنا حل اي معادلة اذا كان موجود

نحدد لها صيغة المعادلة

% Function
f=inline('exp(x)-3*x');

نحدد لها المدخلات، كالاتي
-حدود مجال الحل
-عدد المحاولات الاقصى والذي ستقف عنده اذا لم تجد حلا
هذا لتجنب الدخول في محاولات مالانهائية
-وفي الاخير، الدقة التي نريدها

ونقوم اخيرا بمناداة الدالة مع اعطائها القيم السابقة

[/center]

[CENTER]الدالة ترجع لنا الحل فقط
اذا موجود

اذا مش موجود راح تقلك انها عجزت عن الحل

انت لم تذكر لي الجدول

ساعدل على كود الدالة فيما بعد ان شاء الله
[/center]

تسلم أستاذي ، شكرا لتعاونك …

بالنسبة للخطوات في الصورة أكثر من رائعة واضحة كثيراً …

لكن أخي :

ما تقصد call لما تحتاجها ؟!

وماذا تقصد بكود التجربة ؟

هل الخطوات المصورة السابقة كفيلة بحل المعادلة وعرض البيانات في جدول ؟!

أم هناك خطوات إضافية يجب تطبيقها ؟! …

أنتظر منك الرد ، وشكرا لك …

يوم جمعة سعيد إن شاء الله …

[CENTER]لاظهار تطور الحل في الجدول
نبدل كود الدالة الى مايلي

function [p]=MyBiSection(f,a,b,Tol,N)

% Check if f(a)=0 "a is the root"
if f(a)==0,p=a;return;end

% Check if f(b)=0  "b is the root"
if f(b)==0,p=b;return;end

% Check if f(a)*f(b)<0
if (sign(f(a))==sign(f(b)))
    disp('f(a) and f(b) have the same sign');
    p=NaN;
    return;
end

% Routine
str=10;
disp('N----------|An---------|Bn---------|Pn---------|Fn---------|');

i=1;
Fa=f(a);
p=(a + b)/2;
fprintf('%*.0f |%*.4f |%*.4f |%*.4f |%*.4f |
', str, i,str,a,str,b,str,p,str,f(p));
while i<N
    i=i+1;
   p=(a + b)/2;
   if (f(p)==0 ||(b-a)*0.5<Tol)
       fprintf('%*.0f |%*.4f |%*.4f |%*.4f |%*.4f |
', str, i,str,a,str,b,str,p,str,f(p));
       return
   end
   if sign(f(a))==sign(f(p))
   Fa=f(p);
   a=p;
   else
   b=p;
   end
fprintf('%*.0f |%*.4f |%*.4f |%*.4f |%*.4f |
', str, i,str,a,str,b,str,p,str,f(p));
end
fprintf('
 Method failed after %d iterations 
',N);
p=NaN;

لما نجرب مثلا

clear all; close all;clc

% Function
f=inline('exp(x)-3*x');

% Inputs
a=0;                     % Endpoint
b=1;                     % Endpoint
No=20;                   % Max iterations
Tol=0.001;                 % Tolerance
% 
% % Call of our function
[p]=MyBiSection(f,a,b,Tol,No);

النتيجة تكون

لكن مثلا لو نحدد

clear all; close all;clc

% Function
f=inline('exp(x)-3*x');

% Inputs
a=0;                     % Endpoint
b=1;                     % Endpoint
No=9;                   % Max iterations
Tol=0.001;                 % Tolerance
% 
% % Call of our function
[p]=MyBiSection(f,a,b,Tol,No);

يعني نسمح فقط ب 9 محاولات،
الطريقة ستفشل
لانها لم تصل للدقة المطلوبة وانتهى عدد محاولاتها

منه نقدر نرفع في قيم عدد المحاولات
مع المحافظة على نفس الدقة

لنصل الى عدد المحاولات الادنى اللازم لهذه الدقة
والذي ستنجح معه الطريقة،
اي محاولات بعده، تعتبر زائدة

[/center]