راهنمای استفاده از نرم افزار REDUCE



| |

|راهنمای استفاده از نرم افزار REDUCE |

| |

| |

| |

| |

| |

فهرست

عنوان ............................................................................................................................... صفحه

مقدمه ..................................................................................................................................... 2

آشنايي با محيط نرم افزار REDUCE ................................................................................ 3

1.تعريف identifier ............................................................................................................... 7

2.دستورها ( commands ) .............................................................. 7

3.عملگرها ( operators ) .............................................................. 19

3.1.عملگرهای رياضی ( arithmatic operators ) ................................ 23

3.2.عملگرهای بولی ( Boolean operators ) ................................................ 25

3.3.عملگرهای جبری ( algebraic operators ) ................................ 26

4.توابع رياضی خاص ............................................................................................................... 31

Declarations.5 ............................................................................................................... 32

6.سوئيچ ها ( switches ) ................................................................................................ 37

7.ماتريس ها ................................................................................................................ 42

8.يک نکته ............................................................................................................................ 51

مقدمه

نرم افزار REDUCE يک ابزار محاسبات جبري در رياضي, فيزيک و مهندسي است. توليد اين نرم افزار حاصل تلاش مشترک افراد بسياري است ولي منشأ اصلي شکل گيري آن کار آنتوني هرن[1] در 1963 است. REDUCE براي اولين بار در همين سال توزيع شد و از اين زمان به بعد صدها نفر از راه هاي مختلف در توسعه‌ي اين نرم افزار دخيل بوده اند. براي مثال, جان فيچ[2], هربرت مِلِنک[3], وين فريد نون[4], آرتور نورمن[5] و اِبِرهارد شروفر[6] از افرادي هستند که در شکل گيري هسته ي REDUCE و بسته ها (package ) ي مرتبط شرکت مداوم داشته اند.

برخي قابليت هاي نرم افزار REDUCE عبارتند از:

• مرتب سازي و بسط توابع چندجمله اي و توابع گويا

• انجام انواع جاگذاري ها

• ساده سازي به صورت اتوماتيک يا تحت کنترل کاربر

• انجام محاسبات ماتريسي

• تعيين دقت دلخواه در محاسبه ي اعداد صحيح يا حقيقي

• امکان تعريف توابع جديد و توسعه ي syntax برنامه

• مشتق گيري و انتگرال گيري تحليلي

• فاکتورگيري از چندجمله اي ها

• حل معادلات جبري مختلف

• امکان کنترل شکل خروجي برنامه

• انجام محاسبات مربوط به انواع توابع خاص ( بسل, لژاندر, گاما, زتا و ... )

• انجام محاسبات مربوط به ماتريس هاي ديراک, قابل استفاده براي محاسبات فيزيک انرژي هاي بالا

Reduce یک نرم‏افزار برای محاسبه‏ی عملگرهای جبری با دقت بالاست. بدون توجه به این که چقدر این محاسبه پیچیده باشد. این نرم‏افزار توانایی کار با چند جمله‏ای‏ها به صورت‏های مختلف را دارد و همچنین توانایی فاکتورگیری و همینطور پخش آنها. به علاوه Reduce قادر به انتگرال‏گیری و مشتق‏گرفتن است. کار کردن با آرایه‏ها، فرایندها و عملگرها که ابزار کار فیزیک انرژی‏های بالا است نیز جزء مبانی این نرم‏افزار است. برای راحتی کار امکان تشکیل فایل و استفاده از آن برای ذخیره، تکرار و یا نگه‏داری نتایج برنامه در این نرم‏افزار تعبیه شده است.

یک برتری Reduce محاوره‏ای بودن آن است. بدین صورت که کاربر می‏تواند یک جمله‏ی جبری را وارد کند، نتیجه کارش را مشاهده کند و سپس به ادامه‏ی برنامه بپردازد. برای استفاده از نرم‏افزار به صورت محاوره‏ای بالاخص برای محاسبات طولانی، Reduce می‏تواند در حالت Batch mode استفاده می‏شود که در فیزیک بسیار پرکاربرد است. در این حالت هر دستوری که نوشته می‏شود و برنامه پیش میرود به طور همزمان نتایج کار دیده می‏شود و کاربر راحت‏تر به ادامه کار می‏پردازد.

شروع برنامه‏نویسی:

زمانی که نر‏م‏افزار Reduce توسط سامانه فراخوانده شود، یک پیغام به صورت زیر نوشته می‏شود:

Reduce 3.8 , 15-July-2003 …

که تاریخ و مدل آن هر بار می‏تواند تغییر یابد.

حال شما می‏توانید که جمله را در نرم‏افزار بنویسید. در Reduce هر جمله با یک Semicolon تمام می‏شود که نمایشگر انجام این جمله و آغاز دستور بعدی است مانند:

)x+y+z)^2;

این دستور به طور معمول با یک کاراکتر دیگر ادامه می‏یابد (دکمه Return در صفحه کلیدهای ASCII) تا نرم‏افزار را اصطلاحاً بیدار کند که این کار جمله را دارد می‏کند، محاسبه می‏کند و نتیجه را به صورت زیر می‏نویسد

X2+2*X*Y+2*X*Z+Y2+2*Y*Z+Z2

حال این مثال ساده را به طور گسترده‏تر بررسی می‏کنیم که راجع به روشی که Reduce کار می‏کند بیشتر یاد بگیریم. ابتدا، باید متذکر شویم که Reduce مانند بقیه‏ی زبانهای کامپیوتری با متغیرها و ثابت‏ها سروکار دارد. ولی در محاسبه‏ی عبارت قبلی یک متغیر می‏تواند مستقلاً بررسی شود یعنی از طریق نام خودش تعریف شود که در زبان‏های دیگر برنامه‏نویسی این امکان وجود ندارد. محاسبات جمله‏های جبری از قوانین جبری دبیرستان پیروی می‏کند و تنها چیز غیرعادی در مثال بالا این بوده که عبارت گسترش داده شده است. Reduce همواره عبارت‏ها را تا جایی که امکان وارد گسترش می‏دهد، حسب متغیرهای مختلف جدا می‏کند و براساس روش خاصی به ترتیب درجه‏ی جملات مرتب می‏کند. البته گستردگی، درجه‏بندی متغیرها، نوع خروجی و غیره تحت کنترل کاربر است.

نکته‏ی دیگر راجع به نوع کاراکترهای ورودی و خروجی است. درواقع ورودی می‏تواند به هر دو صورت حروف کوچک و بزرگ باشد و کاراکترهای خروجی همواره با حروف کوچک‏اند.

در نهایت از یک کاراکتری عددی استفاده می‏شود تا بتوان نتیجه را در محاسبات بعدی ارجاع داد.

برای نمایش بیشتر ویژگی‏های نرم‏افزار مثال زیر را بررسی می‏کنیم:

For i:=1:40 product I;

در این مثال نتیجه مقدار !40 خواهد بود که عدد زیر است :

815915283247897734345611269596115894272000000000

شما می‏توانید نتیجه مشابهی را با نوشتن این جمله بدست آورید.

Factorial 40;

چون در محاسبه‏ی جبری جواب دقیق موردنظر است، کاملاً ضروری است که از اعداد صحیح با دقت مشخص استفاده شود. مانند مثال بالا به علاوه عبارت FOR در جمله‏ی بالا یکی از حلقه‏های قابل استفاده است که Reduce برای راحتی کاربر استفاده از آن را ممکن ساخته است.

یکی دیگر از فواید Reduce قابلیت تعیین حداکثر رقم‏های یک عدد است. در حالت عادی 100 امین رقم هر عدد صحیح آفرین رقم قابل استفاده در Reduce است.

در بعضی موارد لازم است از نتیجه‏ی یک عبارت جبری در ادامه‏ی محاسبات استفاده شود یک روشی برای این تعریف یک متغیر جدید با علامت =: است مانند

U:=(x+y+z)^2

در این حالت می‏توانیم از V به جای عبارت بالا در ادامه‏ی برنامه استفاده کنیم.

همچنین نتیجه‏ی آخرین عبارت جبری در برنامه‏ همواره با نام WS (Workspace) در Reduce ذخیره می‏شود و می تواند مورد استفاده قرار گیرد.

به عنوان مثال عبارت:

df(ws,x);

اگر بلافاصله پس از عبارت قبلی بیاید مشتق عبارت ؟؟؟ را نسبت به x محاسبه می‏کند به طور مشابه:

Int(ws,y);

انتگرال‏های عبارت را نسبت به y حساب می‏کند.

Reduce همچنین قادر به کار با نماد ماتریس است. به عنوان مثال:

matrix m(2,2);

M را به عنوان یک ماتریس 2(2 برای برنامه تعریف می‏کند و

m:= mat( (a,b), (c,d) ) ;

مقادیر ماتریس m را تعیین می‏کند. حال عباراتی که شامل عملیات‏های جبری بر روی m می شوند را می‏توان مشاهده کرد مثلاً m/1 که ماتریس معکوس را می دهد و ؟؟؟ که حاصلش یک ماتریس دیگر است و در نهایت det(m) که محاسبه کننده دترمینان ماتریس m است.

Reduce شامل محدوده گسترده‏ای از عملگرهای جانشین است. این نرم‏افزار توابع مقدماتی را می‏شناسد ولی روابط حاکم بر آنها را به طور کلی در بر نمی‏گیرد. به عنوان مثال مجموع توابع مثلثاتی به طور خودبه خودی به حاصل ضرب عبارات زاویه‏ای تبدیل نمی‏شود ولی اگر کاربر بخواهد می‏تواند به عنوان مثال تعریف کند:

( sin(a+b) + cos(a+b))*(sin(a-b) – cos(a-b))

Where cos(~x)*cos(~y)=(cos(x+y)+cos(x-y))/2,

cos(~x)*sin(~y)=(sin(x+y) – sin(x-y))/2,

sin(~x)* sin(~y)= (cos(x-y)- cos(x+y))/2;

به طوریکه علامت تیلروا قبل از متغیرهای x و y نمایانگر عنوان همه‏ی مقادیر این متغیرهاست. نتیجه‏ی محاسبات به صورت زیر محاسبه می‏شود.

-(cos(2*A)+sin(2*B))

یک قابلیت بسیار پراستفاده برنامه و همینطور یکی از چند روش داده‏های خروجی Reduce ، قابلیت نمایش خروجی‏ها در فرم FORTRAN است. این خروجی‏ها بعداً می‏توانند در فرم محاسبات عددی برمبنای FORTRAN استفاده شوند. این خاصیت بالاخص برای فرمول‏های جبری که لازم است به عنوان مبانی محاسبات عددی استفاده شوند کاربرد دارد.

به عنوان مثال، عبارت

On fort;

df (log(x)* (sin(x) + cos(x))/ sqrt(x),x,2)

نتیجه زیر را در بر خواهد داشت:

ANS=(-4.*LOG(X)*COS(X)*X**2-4.*LOG(X)*COS(X)*X+3.*

. LOG(X)*COS(X)-4.*LOG(X)*SIN(X)*X**2+4.*LOG(X)*

. SIN(X)*X+3.*LOG(X)*SIN(X)+8.*COS(X)*X-8.*COS(X)-8.

. *SIN(X)*X-8.*SIN(X))/(4.*SQRT(X)*X**2)

این کاربردهای جبری نمایانگر چهره‏ی جبری Reduce است. Reduce براساس زبان استاندارد برنامه‏ریزی شده است. یک حالت نمادین نیز برای کار با جملات زبانی وجود دارد. این جمله گرامر زبان Lisp را به دنبال خواهد داشت

Symbolic car' (a) ;

جابجایی بین هر دو حالت زبانی امکان‏پذیر است.

حال به معرفی تک تک دستورها می پردازیم:

1.تعريف identifier

برای نام متغيرها, برچسب عبارت دستور go to , نام آرايه ها, ماتريس ها, عملگرها و procedure ها از identifier استفاده می کنيم که می تواند شامل حروف و اعداد باشد ولی اولين حرف آن نبايد عدد باشد.

بيشترين تعداد حروف مجاز برای يک identifier در سيستم های مختلف متفاوت است ولی معمولاً حدود 100 حرف است. هرچند بهتر است برای چاپ راحت تر تعداد حروف کمتر از 25 انتخاب شود.

2.دستورها (Commands)

Syntax:

• ; and $

اين دو حد گزاره ها را تعيين مي کنند. که ; نتيجه را چاپ مي کند ولي $ نتيجه را چاپ نمي کند.

✓ داخل يک گروه يا block هر دو براي جدا کردن گزاره ها به کار مي روند و فرقي با هم ندارند. چون از داخل block بدون وجود دستور return چيزي چاپ نمي شود.

• % or comment

براي نوشتن توضيح در داخل برنامه استفاده مي شوند.

✓ %: هر چيزي بعد از % تا انتهاي خط اجرا نمي شود از جمله ; و $

✓ Comment: از کلمه ي comment تا اولين ; و يا $ اجرا نمي شود. comment براي گذاشتن توضيح چند خطي مناسب است :

1: df (x**3+y,x)% this is a comment;

1: ;

3x2

; خط اول اجرا نشده است.

1: x:a** comment-a is positive

1: a is an integer ;;

X:=a2

اولين; براي پايان comment است و دومي براي چاپ نتيجه.

• group

در جايي که REDUCE انتظار يک گزاره را دارد، چند گزاره را با هم يک گروه مي کند.

مثلاً در if… then يا repeat… until يا while…do داخل حلقه يا عبارت شرطي بايد يگ گزاره داشته باشيم. يا قبل از do که يک گزاره لازم داريم.

✓ گزاره هاي داخل گروه با ; يا $ جدا مي شوند و فرقي با هم ندارند.

✓ گروه مقدار آخرين گزاره را بر مي گرداند. پس اگر بين آخرين گزاره و براکت بسته ( (cos(x+y)+cos(x-y))/2 ,

Cos(~x)*sin(~y) => (sin(x+y)-sin(x-y))/2}$

2: let trigl ;

3: cos(a)*cos(b) ;

[pic]

✓ چند نکته در استفاده از let:

A*B : let A*B=C (1 را مساوي C قرار مي دهد.

A : let A+C=C (2 را مساوي C-B قرار مي دهد.

A : let A-B=C (3 را مساوي C+B قرار مي دهد.

A : let A/B=C (4 را مساوي B*C قرار مي دهد.

• clear

براي حذف کردن تساوي ها يا قوانين جايگزيني

Clear

✓ مي تواند اسکالر، ماتريس، آرايه يا نام procedure باشد.

1: array a(2,3) ;

2: a(2,2) :=15$

3: clear a;

4: a(2,2);

Declare A operator? (Y or N)

5: let x=y+z;

6: sin(x);

Sin(y+z)

7: clear x;

8: sin(x);

Sin(x)

9: let x^5=7;

10: clear x;

11: x^5;

7

12: clear x^5;

13: x^5;

[pic]

✓ اگر clear برای اجزای آرايه استفاده شود, در صورتی که اين جزء محتوی عبارت غير معتبر برای clear باشد ( مثل عدد ثابت ) پيغام error می دهدو در غير اين صورت متغير موجود در اين جزء پاک می شود. برای ماتريس ها اگر عبارت غير معتبر باشد error ظاهر می شود و در غير اين صورت هيچ عملی انجام نمی شود.

✓ برای اينکه اجزای آرايه يا ماتريس را مساوی صفر قرار دهيد از clear استفاده نکنيد. اين کار نتيجه ی مورد انتظار شما را نخواهد داشت. چون اجزا نه محتوی صفر خواهد بود و نه محتوی هيچ چيز ديگر.

✓ همان طور که در مثال آخر می بينيد وقتی يک عبارت ( توانی, ضربی و ... ) با چيزی جايگزين شده, برای پاک کردن اين جايگزينی کل عبارت تا قبل از = بايد در آرگومان clear نوشته شود.

• Clearrules

برای پاک کردن يک rule list از clearrules استفاده می کنيم:

1:trig 1: ={cos(~x)cos(~y) => (cos(x+y)+cos(x-y))/2;

cos(~x)sin(~y) => (sin(x+y)-sin(x-y)/2}$

2: let trigl ;

3: cos(a)*cos(b);

[pic]

4: clearrules trigl ;

5: cos(a)*cos(b);

cos(a)cos(b)

• for all

for all let

يا:

for all < identifier> such that let

1: for all x let f(x)=sin(xn2);

Declare f operator? (Y or N)

2: Y

3: f(a);

Sin (a2)

4: operator pos;

5: for all x such that x>=0 let pos(x) = sqrt(x+1) ;

6: pos (5);

[pic]

7: pos(-5);

Pos(-5)

8: clear pos;

9: pos(5);

declare pos operator? (Y or N)

✓ براي پاک کردن جايگزيني توسط for all به اين مثال توجه کنيد:

1: for all a such that a>o let xna =1;

2: xn4;

1

3: clear xna ;

*** xna Not Found

4: for all a clear xna;

5: xn4;

1

6: for all a such that a>0 clear xna ;

7: xn4;

x4

✓ for all …let معادل تعريف يک procedure است با اين تفاوت که در procedure مقدار پارامتر صوري (صدا زننده ي procedure) به صورت global عوض نمي شود حتي اگر داخل procedure مقداري به آن assigne شده باشد (در اين رابطه آرايه ها استثنا هستند)

دستورهاي ديگري هم تحت عنوان general commands داريم که توضيح آنها به اختصار چنين است:

bye (1 [pic] از يک سطح برنامه خارج مي شود و به سطح (level) بعدي مي رود و اگر در بالاترين سطح باشيم از REDUCE خارج مي شود. اين دستور معادل quit است

display() (2 [pic] خط قبل را چاپ مي کند و اگر پرانتز خاي باشد يا از تعداد خطوط بيشتر باشد همه ي خطوط را از اول چاپ مي کند.

rederr (3 [pic] يک پيغام error از داخل procedure يا block چاپ مي کند.

retry (4 [pic] آخرين گزاره اي که منجر به error شده است را دوباره امتحان مي کند.

load-package "" (5 [pic] package مورد نظر را load مي کند و در قسمت toolbar برنامه هم قابل دسترسي است.

3.عملگرها (Operators)

Syntax

• Assign :=

مقدار سمت راست را به سمت چپ assign مي کند.

✓ : = از سمت راست اعمال مي شود:

1: a:=b:=c $

2: a;

c

3: b;

c

همه ي عبارتها در اين زنجيره به غير از عبارت آخر برابر با c قرار داده مي شوند.

✓ سمت چپ ممکن است يک expression باشد:

1: y+b:=c &

2: y;

-(b-c)

✓ : = براي اجزاي آرايه ها کاربرد دارد ولي براي کل آرايه نه. ولي براي درايه هاي ماتريس يا کل يک ماتريس مي توان از آن استفاده کرد.

✓ استفاده از ساختار بازگشتي مثل a:a+b هم مانعي ندارد.

• equal sign =

در گزاره هاي شرطي ( مثل if…then…else يا repeat…until ) و در تعريف equation به کار مي‌رود.

1: a:=4 $

2: if a=10 then write "yes" lese write "no";

No

• + - * /

کاربرد + و – واضح است. استفاده از آنها براي ماتريس ها و equation ها هم ممکن است.

اپراتور * مي تواند براي ضرب ماتريسها با بعد مناسب هم استفاده شود.

✓ در عبارتي مثل REDUCE ,2x به طور ضمني اپراتور * را در نظر مي گيرد چون identifier نمي تواند با عدد شروع شود.

اپراتور / هم براي ماتريس هاي مربعي مي تواند استفاده شود: A/B=A*B^-1 به شرطي که B وارون پذير باشد. 1/A هم معکوس A را مي دهد.

1: 100/6 ;

[pic]

2: 16/2/x ;

[pic]

3: on rounded ;

4: 55/4;

8.75

• ** or ^

1: x**y**z;

xyz

2: x**(Y**Z);

[pic]

3: on rounded;

4: 2**pi ;

8-82497782708

✓ ماتريس مربعي مي تواند به توان مثبت يا منفي (به شرط معکوس پذيري) برسد.

✓ عبارت هاي اسکالر و equation ها مي توانند به توان کسري و اعشاري برسند.

• = >

اين اپراتورها فقط براي مقايسه بين متغيرهايي که متناظر با يک عدد هستند استفاده مي شوند و در صورت برقراري شرط، true برمي گردانند. true اي که برمي گردانند فقط به عنوان عبارات شرطي در while…do يا repeat…until يا if…then…else استفاده مي شود.

• ~

اپراتور (tild) ~ يک free variable را نشان مي دهد.

• and & or

and : اگر هر دو argument درست باشد، true برمي گرداند.

or : اگر حداقل يکي از argument ها درست باشد، true برمي گرداند.

✓ فقط در عبارتهاي شرطي استفاده مي شوند.

✓ از سمت چپ اعمال مي شوند: x and y and z = (x and y) and z

• Where

مثال:

1: x**2+17*x*y+4*y**2 where x=1, y=2;

51

2: for i:=1:5 collect x**i*q where q=for j:= product j;

{x,2x2,6x3,24x4,120x5}

3: x**2+y+z where z=y**3, y=3;

X2+y3+3

✓ مقداردهي يک متغير به وسيله ي اپراتور where تأثيري بر مقدار اين متغير خارج از عبارت موردنظر ندارد.

• list

اپراتور list از آرگومانهاي خود يک ليست مي سازد:

list (item, item,…);

1: liss := list (c,b,c, {xx,yy} ,3x**2+7x+3, df (sin(2*x),x));

liss:= {c,b,c,{xx,yy},3x2+7x+3,2cos(2x)}

براي کار کردن با يک list اپراتورهاي مختلفي وجود دارد:

(1 دستورات third (list) , second (list) , first (list) به ترتيب المان اول، دوم و سوم list را برمي‌گردانند.

دستور کلي تر براي دسترسي به المان هاي part , list است:

1: alist := list (c,b,c, {xx, yy} , x**z)$

2: part (a list, 4) ;

{xx, yy}

3: part (a list, 4, 1);

xx

cons (item, list) (2 [pic] item را به اول list اضافه مي کند و معادل عملگر . (dot) است.

1: a list := {b,c}$

2: a. a list;

{a,b,c}

3: liss := cons(a,{b}); % also liss := a cons{b};

new liss := {{a,x}, {b,x}}

5: for each y in new liss sum (first(y))*(second(y));

x(a+b+c)

(3 length (list) [pic] تعداد المان هاي يک list را مي دهد.

(4 append (list, list) [pic] دو list را يکي مي کند (با همان ترتيب آرگومانها)

(5 rest (list) [pic] ليستي را برمي گرداند که المان اول list از آن حذف شده است.

(6 reverse(list) [pic] برعکس list را برمي گرداند. Reverse و cons مي توانند براي اضافه کردن يک المان به انتهاي يک ليست استفاده شوند:

1: reverse (q cons reverse (a,b,c));

{a,b,c,q}

(7 sort (list , comp) [pic] اعضاي list را بر حسب قاعده اي که با comp تعيين مي شود sort مي‌کند:

1: for i:=1:10 collect random(50)$

2: sort (ws, > =);

{41,38,33,30,28,25,20,17,8,5}

• ws

ws آخرين نتيجه را برمي گرداند و ws(number) نتيجه ي خطي که شماره ي آن برابر با number است را برمي گرداند.

1: df (siny,y);

cos(y)

2: ws 2;

Cos(y)2

3: df (ws 1, y);

-sin(y)

3.1.عملگرهاي رياضي (Arithmatic operators):

• ln , log

هر دو اپراتور لگاريتم طبيعي را حساب مي کنند.

✓ براي محاسبه بايد سويچ rounded روشن باشد. محدوديت هاي ln در مقابل log در مثال‌هاي زير واضح است:

1: ln(4); 1: log(4);

ln(4) log(4)

2: ln(e) 2: log(e);

ln(e) 1

3: on rounded; 3: on rounded;

4: ln(e); 4: log(e);

1 1

5: ln(4); 5: log(4);

1.38629436112 1.38629436112

6: df(ln(x),x); 6: df(log(x),x);

[pic] [pic]

✓ استفاده از log توصيه مي شود.

✓ log(expression, integer) لگاريتم expr. را در مبناي int. حساب مي کند و محدوديت‌هاي آن مثل ln است.

• Sqrt

1: sqrt (16* [pic]3);

[pic]

2: sqrt (17);

[pic]

3: on rounded;

4: sqrt (17);

4: 1231056562

5: sqrt (a*b*c[pic]5*d[pic]3*27);

5: 1961524271 (d3c5ba)0.5

6: off rounded;

7: ws;

abs(d)c2 3[pic]

✓ در شرايطي که سويچ precise، روشن باشد [pic]را به صورت abs(d) نمايش مي‌دهد و اگر off باشد، فقط خود d را چاپ مي کند.

اپراتورهاي رياضي ديگري هم هستند که چون ساده اند يا کاربرد زيادي ندارند آنها را به اختصار شرح مي دهيم:

(1 abs (expression) [pic]اندازه ي expression را برمي گرداند.

(2 choose (m,n) [pic] انتخاب m از n [pic] [pic]

(3 factorial number [pic] فاکتوريل number را حساب مي کند.

(4 gcd(a,b) [pic] ب.م.م دو عدد a و b را حساب مي کند.

(5 max (expression, expression,…) [pic] ماکسيمم چند expression را مي دهد.

(6 next prime (expression) [pic] اولين عدد اول بعد از expression را مي دهد.

(7 norm (expression) [pic] با روشن بودن سوئيچ rounded اندازه ي exp. را حساب مي کند. اگر سوئيچ complex هم روشن باشد، اندازه ي عدد مختلط (a+bi) را هم حساب مي کند.

(8 perm (m,n) [pic] ترکيب m از n را حساب مي کند.

(9 remainder (expression1, expression2) [pic] باقيمانده ي تقسيم expr.1 بر expr.2 را حساب مي کند. expression ها مي توانند عدد يا چند جمله اي باشند.

(10 round (number) [pic] number را به نزديک ترين integer گرد مي کند.

(11 sign (expression) [pic] 1 يا 0 يا -1 برمي گرداند و علامت expr. را تعيين مي کند.

Boolean Operators.3.2:

(1 = [pic] اگر دو طرف برابر باشند true برمي گرداند.

even p (integer) (2 [pic] اگر integer مثبت و زوج باشد true برمي گرداند.

member (3 [pic] اگر عنصر باشد true است.

neq (4 [pic] اگر دو برابر نباشند، true برمي گرداند.

not (logical expression) (5 [pic] اگر (false) nil, logical expr. باشد true برمي گرداند.

number p (expression) (6 اگر expr. عدد باشد true برمي گرداند.

Primep (expression) (7 [pic] اگر expr. عدد اول باشد، true برمي گرداند.

(8 free of (expression, kernel) [pic] اگر argument اول شاملargument دوم نباشد، true برمي گرداند.

✓ براي اين اپراتورها 0 يا nil، false محسوب مي شود و هر چيزي غير از اينها true به حساب مي آيد.

3.3.عملگرهاي جبري( Algebraic Operators ):

• df

df (expression, var1, number, var2, number2,…)

df از expression به ترتيب نسبت به var1 به تعداد number1 و نسبت به var2 به تعداد number2 و ... مشتق گيري جزئي انجام مي دهد:

1: df (x**4*y+sin(y),y,x,3);

24x

2: for all x let df (tan(x),x)=sec(x)**2;

3: df (tan(3*x),x);

3 sec(3x)2

✓ اگر بعد از نام متغير، مرتبه مشتق گيري را مشخص نکنيد، مرتبه يک در نظر گرفته مي‌شود (مثل مثال اول)

✓ مي توانيد مثل مثال دوم با استفاده از دستور let قواعد مشتق گيري مورد نظر خودتان را تعريف کنيد. در اين صورت اين تعريف بر قاعده ي مشتق گيري خود REDUCE اولويت دارد و با پاک کردن قوانين هم (clear rules) به حالت قبل برنمي گردد. فقط با پايان برنامه اين قاعده پاک مي شود.

✓ در تعريف depend مي توانيد ببينيد که چطور مشتق هاي ضمني را مي توان وارد کرد.

• int

اپراتور انتگرال گيري:

1: int (sin(x)*exp(2*x),x);

[pic]

2: int (1.[pic]2-2),x);

[pic]

3: int (1/sqrt([pic]2-x),x);

[pic]

✓ انتگرال هايي که شامل عبارت هاي جبري مثل ريشه ي دوم هستند نمي توانند محاسبه شوند. مگر اينکه package به نام load , algint شده باشد که خود به خود سويچ algint را هم روشن مي کند:

4: load-package "algint";

5: int (1/sqrt([pic]2-x), x);

[pic]

✓ مثل اپراتور مشتق، اينجا هم مي توانيد با استفاده از let قواعد خود را براي انتگرال گيري تعريف کنيد.

✓ براي انتگرال معين، عملگر جداگانه اي وجود ندارد. بايد (با روشن بودن سوئيچ rounded) مقدار انتگرال را براي دو سر بازه حساب کرده و از هم کم کنيد.

✓ اگر سوئيچ failhard روشن باشد، REDUCE در صورتي که نتواند انتگرال را حساب کند به جاي چاپ به شکل int(…) ، يک پيغام error چاپ مي کند.

• limit

با استفاده از امکانات package اي به نام limits مي توان از اپراتور limit(expr., var, limpoint) حد expr. را نسبت به var در نقطه ي limpoint محاسبه کرد.

1: limit (x*cot(x),x,o);

0

2: limit [pic]

[pic]

✓ حد راست و چپ را به طور جداگانه مي توان با استفاده از limit!- و limit!+ حساب کرد.

• Solve

اين عملگر يک معادله ی جبری يا دستگاهی از معادلات را حل می کند.

Solve (,)

يا:

Solve({,,…},{,,…})

✓ ليست دوم نشان می دهد که معادله بر حسب کدام متغيرها بايد حل شود و اگر تعداد معادلات و متغير ها برابر باشد می توان آن را حذف کرد.

1: sss := solve(x^2+7);

x

[pic]

2: rhs first sss;

[pic]

3: solve(sin(x^2*y),y);

[pic]

4: off allbranch;

5: solve(sin(x^2*y),y);

{y=0}

6: solve({3x+5y=-4,2x+y=-10},{x.y});

[pic]

7: solve({x+a*y+z,2x+5},{x,y});

[pic]

8: ab := (x+2)^2*(x^6+17x+1)$

9: solve(ab,x);

[pic]

10: root_multiplicities;

{2,1}

✓ اگر عملگر solve نتواند يک معادله را حل کند, بخش حل نشده را به عنوان آرگومان root_of برمی گرداند.

✓ درجه ی ريشه های معادله در متغير root_multiplicities ذخيره می شود و با صدا کردن اين متغير در ليستی نمايش داده می شود.

✓ اگر يک دستگاه معادلات خطی داشته باشيم با روشن کردن سوئيچ cramer سرعت حل معادلات افزايش می يابد.

✓ اگر معادلات يک دستگاه متناقض باشند solve يک ليست خالی برمی گرداند و اگر اين معادلات پارامتری باشند, متغير requirements شرايطی را که تحت آن معادلات سازگار خواهندشد را نشان می دهد. شرط سازگاری بايد مساوی صفر قرار بگيرد:

1: solve({x-a,x-y,y-1},{x,y});

{}

2: requirements;

{a-1}

✓ برای يک دستگاه معادلات خطی و پارامتری متغير assumptions ليستی از روابط برای اين پارامترها را برمی گرداند و جواب معادله تا وقتی معتبر است که هيچ کدام از اين روابط مساوی صفر نشوند:

1: solve({a*x-b*y+x,y-c},{x,y});

[pic]

2: assumptions;

{a+1}

✓ وقتی سوئيچ allbranch روشن است ( defult ) تمام ريشه های معادله نشان داده می‌شوند. ولی اگر خاموش باشد, فقط ريشه های اصلی نشان داده می شوند. مثل خط 4و5 مثال اول.

• Ode solve

ode solve package براي حل (ordinary differential equation) ode است و محدوديت هايي دارد: -1 فقط يک معادله را مي تواند حل کند. -2 فقط قادر به حل معادله ساده ي مرتبه اول، معادله ي خطي با ضرايب ثابت و معادلات اويلر است.

ode solve (expr., var1, var2)

expr. =0 معادله ديفرانسيل مورد نظر است. var1 متغير وابسته وvar2 متغير مستقل است.

✓ در expr.، مشتق را با عملگر df نمايش مي دهيم.

1: depend y,x ;

2: ode: = df (y,x) +y*sinx/cosx-1/cosx $

3: ode solve (ode, y, x);

{y=arbconst(1)*cos(x)+sin(x)}

✓ اپراتور arbconst مخفف arbitrary constant است براي نمايش ثابت دلخواه در حل معادله ديفرانسيل

• Show rules

تمام قوانين مربوط به آرگومان خود را نمايش مي دهد:

1: show rules log;

[pic]

✓ اين قواعد مثل اعضاي يک list قابل دسترس هستند:

2: rhs second ws;

1

برخي اپراتورهاي جبري ديگر:

Conj (expression) (1 [pic] مزدوج مختلط expression را برمي گرداند.

Hypot (n,m) (2 [pic] اگر m, n عدد باشند [pic]را برمي گرداند.

Import (expression) (3 [pic] بخش موهومي expression را برمي گرداند.

Repart (expression) (4 [pic] بخش حقيقي expression را برمي گرداند.

num (expression) (5 [pic] بعد از ساده کردن expression صورت آن را برمي گرداند.

prod (expression, k, lolim, uplim) (6 [pic] معادل [pic]است.

sum(expression, k, lolim, uplim) (7 [pic] معادل [pic]است.

4.توابع رياضي

• exp

exp (expression) or [pic] or e**

1: exp (sin(x)) ;

esin(x)

2: exp (11) ;

e11

3: on nonded

4: exp (sin(pi/3));

2.37744267524

✓ براي گرفتن جواب صريح عددي، سويچ rounded روشن باشد.

• erf

تابع خطا:

erf(x)= (2/sqrt(pi))*int([pic](-[pic]2),x)

خواص محدودي از اين تابع براي REDUCE شناخته شده است از جمله فرد بودن و مشتق آن و از روي اينها بعضي انتگرالها قابل محاسبه است.

1:erf(0) ;

0

2: erf(-a) ;

-erf(a)

3: df (erf([pic]2),x) ;

[pic]

4: int (erf(x),x) ;

[pic]

• توابع مثلثاتي

توابع مثلثاتي با اپراتور هم نام خود قابل دسترسي هستند:

cos(expr), cosh(expr), cot(expr), coth(expr), csc(expr), csch(expr), ses(expr), sech(expr), sin(expr), sinh(expr), tan(expr), tanh(expr)

معکوس اين توابع (…, sin-1, cos-1) با اضافه کردن "a" به اول نام اپراتورها به کار مي روند:

acos(expr), acosh(expr), acot(expr), acoth(expr), acsc(expr), acsch(expr), asec(expr), asech(expr), asin(expr), asinh(expr), atan(expr), atanh(expr)

براي گرفتن جواب دقيق و صريح عددي، سوئيج rounded بايد روشن باشد.

• توابع خاص رياضي در Special Function Package با دستور load-package specfn قابل دسترسي هستند.

اطلاعات موجود در اين package: برخي ثابت هاي معروف، تابع بسل، چند جمله اي هاي خاص، تابع گاما، تابع زتا (Zeta)، توابع و انتگرال هاي بيضوي، ضرايب Clebsch-Gordan و ... براي هر کدام از اينها چند اپراتور وجود دارد که معرفي همه ي آنها در اين راهنماي خلاصه نمي گنجد. با استفاده از اين package بعضي محاسبات هم راحتتر مي شود. مثل محاسبه ي سريهايي که جواب آنها شامل توابع خاصي است.

5.Declaration

• array

تعريف آرايه به اين شکل است:

array identifier (dimension, dimension, …)

✓ هر جزء آرايه بلافاصله بعد از تعريف آن، با صفر مقداردهي مي شود.

1: array a(2,5), b(3,3,3);

2: a(3,4);

0

3: length a;

{3,6}

✓ تعريف آرايه هميشه global است. حتي اگر داخل procedure يا block تعريف شود.

✓ اجزاي آرايه به صورت a(i,j) قابل دسترسي هستند.

✓ اپراتور : = يا دستور let فقط براي تک تک اجزاي آرايه کاربرد دارد، نه کل آرايه.

✓ انديس آرايه يا شماره ي خانه هاي آن از صفر شروع مي شود. بنابراين مثلا خانه هاي a(5) از صفر تا 5 شماره مي خورند. پس طول آرايه ي 6, (length a)a است.

• Precision

دقت اعشار را در حالتي که سوئيچ rounded روشن است تعيين مي کند (پيش فرض 12 است)

1: on rounded;

2: 7/9;

0.777777777778

3: precision 20;

20

4: 7/9;

0.77777777777777777778

• depend

وقتي در تعريف از depend استفاده مي کنيم، يعني argument اول بستگي به بقيه ي argument ها دارد. اين بستگي با استفاده از nodepend از بين مي رود.

1: depend y,x ; 1: depend z, cos(x), y ;

2: df (y**2, x) ; 2: df (sin(z) , cos(x) ;

[pic] [pic]

3: nodepend y,x ; 3: depend y, x ;

4: df (y**z, x) ; 4: df ([pic]z , x);

0 [pic]

✓ اپراتورهاي خطي، در اعمال خطي بودن وابستگي متغيرها را در نظر مي گيرند (به تعريف خطي اپراتورها مراجعه کنيد)

✓ با استفاده از اپراتور free of مي توانيد وابستگي دو متغير را چک کنيد.

✓ بيش ترين کاربرد depend در حل معادله ديفرانسيل با استفاده از عملگر ode solve است.

• Operator

با تعريف کردن يک اپراتور مي توانيد عملگر دلخواه خود را بسازيد.

1: operator dis ;

2: let dis (~x, ~y) = sqrt ([pic];

3: dis (1,2) ;

[pic]

4: dis (a,10);

[pic]

1: operator fac;

2: let fac(~n) = if n=0 then 1

2: else if not (fixp n and n>0)

2: then rederr uchoose non-negative integer"

3: fac (5);

120

✓ مواظب باشيد يکي از اپراتورهاي خود سيستم را دوباره تعريف نکنيد.

✓ اپراتورها مي توانند داخل procedure تعريف شوند و در اين صورت global هستند.

✓ پارامتر صوري (صدا زننده ي procedure) مي تواند يک اپراتور باشد.

اپراتورها مي توانند با خواص مختلفي تعريف شوند:

(1 infix [pic]براي تعريف عملگر ميانوندي.

1: infix aa;

2: for all x, y let aa(x,y). cos(x)*cos(y)-sin(x)*sin(y);

3: x aa y;

cos(x)cos(y)-sin(x)sin(y)

4: pi/3 aa pi/2 ;

[pic]

✓ دقت کنيد که در عبارت let، اپراتور پيشوندي تعريف شده است.

✓ بعد از تعريف اپراتور مي تواند هم به صورت پيشوندي و هم ميانوندي استفاده شود.

(2 even: اپراتور نسبت به آرگومان اولش فرد تعريف مي کند:

1: even f;

2: f(-a, -b);

f(a, -b)

linear (3 [pic]يک اپراتور را بر حسب متغير اول آن خطي تعريف مي کند.

✓ اول اپراتور بايد تعريف شده باشد و بعد خطي تعريف شود.

1: operator f;

2: linear f ;

3: f(o,x) ;

0

4: f(-y,x) ;

-f(l,x)y

5: f(y+z,x) ;

f(1,x)(y+z)

6: depend z,x ;

7: f(y*z, x) ;

f(z, x)y

8: depend y,x ;

9: f([pic]) ;

f([pic])

10: nondepend z,x ;

11: f([pic]) ;

[pic]

دقت کنيد که اضافه کردن وابستگي متغيرها چگونه در اعمال خطي بودن تأثير مي گذارند.

✓ اگر argument اول شامل argument دوم باشد هم تأثير اين وابستگي به همين شکل اعمال مي شود.

(4 noncom [pic] اگر يک اپراتور را nancom تعريف کنيم به اين معني است که اين اپراتور تحت عمل ضرب جا به جا پذير نيست:

1: operator f, h ;

2: noncom f ;

3: h(a)* h(b)-h(b)* h(a) ;

0

4: f(u)* f(b)-f(b)* f(a);

f(a)f(b)-f(b)f(a)

✓ در پيش فرض REDUCE يک اپراتور، غيرخطي، پيشوندي و جابه جا پذير تعريف مي‌شود.

• scalar, real, integer

تعريف متغير به صورت integer, real يا scalar بايد بلافاصله بعد از begin در يک block انجام شود. تعريف، به صورت local داخل block است و بلافاصله با صفر مقداردهي مي شود. بعد از پايان block اين متغير حذف مي شود. تغييرات مقدار آن داخل block متغير هم نام آن خارج از block را تغيير نمي دهد. استفاده از real و integer به معني اينکه REDUCE نوع متغير را چک مي کند نيست و فقط براي اطلاع خود کاربر است.

• equation

equation عبارتی است که در آن دو عبارت جبری به وسيله ی عملگر = به هم وصل شده اند و به شکل زير است:

left-hand side=right-hand side

✓ عبارت سمت چپ معادله به وسيله ی عملگر lhs() و عبارت سمت راست آن به وسيله ی عملگر rhs() قابل دسترسی هستند.

✓ عبارت سمت راست هميشه محاسبه می شود. ولی برای محاسبه شدن عبارت سمت چپ, سوئيچ evallhseqp بايد روشن باشد.

✓ وقتی يک معادله بخشی از يک عبارت منطقی است, مثل عبارت if يا while , دو طرف آن از هم کم شده و مقدار آن با صفر مقايسه می شود.

✓ معادله می تواند يک عضو list باشد. همچنين می توان يک متغير را برابر با يک equation قرار داد.

✓ اگر سوئيچ evallhseqp روشن باشد, می توان دو معادله را با هم جمع يا از هم کم کرد يا يک معادله را به توان رساند.

1: on evallhseqp;

2: u := x+y=1$

3: v := 2x-y=0$

4: 2*u-v;

-3y=-2

5: ws/3;

[pic]

6: lhs(u);

x+y

6.سوئيچ ها (switches )

سويچ ها مي توانند به وسيله ي دستورهاي on و off روشن و خاموش شوند:

on switch-name ;

off switch-name ;

روشن يا خاموش بودن يک سوئيچ کارايي سيستم را تغيير مي دهد.

تعداد سوئيچ هاي تعريف شده در REDUCE بسيار زياد است. در اينجا فقط به سوئيچ هايي که در مثال ها به آنها اشاره کرديم يا مهم تر هستند مي پردازيم:

• algint

کاربرد سوئيچ algint را در استفاده از اپراتور int ببينيد.

• combineexpt

در صورت روشن بودن، توانايي REDUCE را در ساده کردن عبارتهاي تواني افزايش مي دهد:

1: [pic]

[pic]

2: on combineexpt ;

3: ws ;

3

• complex

با روشن بودن complex قوانين رياضيات مختلط در ساده سازي، محاسبه ي توابع، فاکتورگيري و ... استفاده مي شود بدون آن، REDUCE تنها مي داند که i برابر با [pic] است:

1: ([pic]+[pic]2)/(x+i*y) ;

(iy+x)-1(x2+y2)

2: on complex ;

3: ws ;

x-iy

• cramer

با روشن بودن سوئيچ cramer، عمليات معکوس کردن ماتريس و حل معادلات خطي (solve) با استفاده از روش کرامرز انجام مي شود که سريع تر است. البته اگر درايه هاي ماتريس عدد باشند عمليات کندتر ميشود بنابراين قبل از روشن کردن اين سوئيچ به نوع ماتريس توجه کنيد.

• failhard

در صورت روشن بودن اين سوئيچ، در صورتي که REDUCE نتواند يک انتگرال را به فرم بسته حساب کند، پيغام خطا مي دهد.

• gcd

اگر اين سوئيچ روشن باشد، فاکتورهاي مشترک صورت و مخرج هنگام چاپ جواب ساده مي شوند.

• listargs

در حالت کلي، اگر آرگومان يک اپراتور list باشد ولي اين اپراتور براي list تعريف نشده باشد، جواب، ليستي است که در عضو آن تأثير اپراتور روي عضو متناظر آن در آرگومان تابع است. روشن بود سوئيچ listargs از اين عمل جلوگيري مي کند:

1: log {a,b,c} ;

{log(a), log(b), log(c)}

2: on listargs ;

3: log {a,b,c} ;

log({a,b,c})

• multiplicities

در حل يک معادله (solve) اگر يک ريشه درجه اي بيشتر از يک داشته باشد، صريحاً در جواب اين درجه نشان داده نمي شود. بلکه در متغير root-multiplicities ذخيره مي شود، ولي با روشن بودن سوئيچ multiplicities، درجه ي ريشه در خود جواب مشخص است:

1: solve([pic]2=2x-1, x) ;

x=1

2: root-multiplicities ;

2

3: on multiplicities;

4: solve ([pic]2=2x-1, x);

x=1 , x=1

• nero

اگر سوئيچ nero روشن باشد، متغيري که مقدار صفر دارد چاپ نمي شود. اين کار به خصوص وقتي با ماتريس هاي بزرگ سر و کار داريم مفيد است که مي توان فقط درايه هاي غير صفر را در صفحه ديد.

• output

اگر سوئيچ output خاموش باشد، هيچ نتيجه اي روي صفحه چاپ نمي شود حتي اگر انتهاي خط دستور ; باشد. چون چاپ نتيجه زمان بر است، در صورتي که با محاسبات مفصل و نتايج پيچيده سروکار داريد، خاموش کردن اين سوئيچ مي تواند برنامه را سريع تر پيش ببرد. در صورت احتياج به نتيجه ي يک خط خاص مي توانيد از ws(number) استفاده کنيد.

• Precise

1: sqrt ([pic]2);

x

2:( [pic]2[pic](1/4);

[pic]

3: on precise;

4: sqrt ( [pic]2[pic];

abs(s)

5: ( [pic]2[pic](1/4);

[pic]

• Rounded, roundall, roundbf

✓ با روشن بودن سوئيچ rounded رياضيات اعشاري فعال مي شود.

1: pi ;

[pic]

2: 35/217 ;

[pic]

3: on rounded ;

4: pi ;

3.141592359

5: 35/217 ;

0.161

✓ براي تغيير دقت اعشار از دستور precision استفاده کنيد. به طور پيش فرض، دقت اعشار 12 رقم است.

✓ اگر بخواهيد اعداد کسري به شکل اعشاري در نيايند، سوئيچ round all را خاموش کنيد:

1: on rounded ;

2: sqrt (3);

1.73205080756

3: 1/2 ;

0.5

4: off round all ;

5: 1/2 ;

[pic]

✓ اگر بخواهيد REDUCE اعداد بسيار کوچک را صفر چاپ نکند بايد سوئيچ roundbf را روشن کنيد.

1: on rounded;

2: exp (-100000.[pic]2);

0

3: on round bf ;

4: exp (-100000. [pic]2);

1.18441281937e-4342953505

• Time

اگر سوئيچ time روشن باشد، زمان سيستم که براي اجرا کردن هر گزاره ي REDUCE استفاده شده است بعد از چاپ جواب، نمايش داده مي شود.

1: on time ;

time : 281 ms

2: df (sin ([pic]2+y), y);

cos([pic]+y)

time: 0 ms

3: solve ([pic]2-6*y, x);

[pic]

Time: 16 ms

✓ زماني که بعد از روشن کردن time چاپ مي شود، زماني است که از ابتداي شروع برنامه محاسبه شده است.

✓ بعد از هر دستور، زمان محاسبه چاپ مي شود که شامل زمان تايپ کردن دستور نيست.

✓ در جاهايي که ادعا کرديم روشن بودن يک سوئيچ مي تواند سرعت اجرا و محاسبه را افزايش دهد (مثل سوئيچ cramer و output) اين سرعت را مي توانيم با روشن کردن time چک کنيم.

7.ماتريس ها( Matrix )

• تعريف ماتريس:

يک identifier را مي توانيم از نوع matrix تعريف کنيم.

1: matrix a, b(1,4);

2: b(1,1) ;

0

3: a(1,1) ;

***** Matrix A not set

✓ تعيين مرتبه ي ماتريس هنگام تعريف آن اجباري نيست. ولي در صورت تعريف مرتبه همه‌ي درايه ها با صفر مقداردهي مي شوند و در صورت عدم تعريف مرتبه، درايه ها قابل دسترسي نيستند.

4: a:= mat[(x0, y0), (x1, y1))

5: length a;

{2,2}

6: b: = [pic]2 ;

[pic]

✓ در صورت نياز، مرتبه ي ماتريس با محاسبات هماهنگ مي شود (مثل ماتريس b)

✓ let را مي توان به کل يک ماتريس اعمال کرد، ولي اگر let و clear به يک درايه ي ماتريس بخواهد اعمال شود، حتماً اين درايه بايد محتوي يک ثابت باشد.

✓ عمليات جبري را مي توان براي ماتريس ها به کار برد در صورتي که مرتبه ها درست باشد (+ - * /) 1/A يا /A عکس ماتريس A را مي دهد (در صورت معکوس پذيري). A/B هم به صورت [pic] تعريف مي شود. هم چنين ماتريس هاي مربعي را مي توان به توان صحيح مثبت و منفي (در صورت معکوس پذيري) رساند.

• اپراتور mat : براي نمايش ماتريس

1: mat ((1,2), (3,4)) ;

[pic]

2: matrix q;

3: a;= ws ;

q := [pic]

4: a: = mat ((sin(x), cos(x), 1);

a:= (sin(x) cos(x) 1)

✓ براي استفاده از mat احتياجي نيست که ماتريس قبلاً تعريف شده باشد و مرتبه آن مشخص باشد.

✓ Mat در صورت نياز مرتبه ي تعريف شده براي ماتريس را تغيير مي دهد.

✓ اگر بخواهيم به درايه ها دسترسي داشته باشيم (a(i,j)) حتماً ماتريس بايد تعريف شده باشد.

• اپراتور cofactor

cofactor (matrix-expression, row, column)

1: cofactor (mat ((a,b,c), (d,e,f), (p,q,r)), 2, 2);

ar- cp

2: cofactor (mat((a,b,c), (d,e,f)), 2, 2);

***** non-square matrix

• اپراتور def : براي محاسبه ي دترمينان ماتريس

1: m: = mat (a,b,c), (d,e,f), (p,q,r)) $

2: def m; ,% also det(m);

aer-afq-bdr+bfp+cdq-cep

3: def (5);

5

• اپراتور mateigen: براي به دست آوردن معادله ي ويژه مقدار و ويژه بردارهاي يک ماتريس

mateigen (matrix-expression, var)

✓ Var نام متغيير معادله ي ويژه مقدار است.

1: aa: = mat (2,5), (1,0)) $

2: mateigen (aa, alpha);

[pic]

3: bb: = mat ((1,2,3), (4,5,6), (7,8,9))$

4: mateigen (bb, alpha);

[pic]

✓ در ليست هايي که برگردانده مي شود، عضو اول معادله ي ويژه مقدار است که مساوي صفرقرار مي گيرد، عضو دوم درجه ي ويژه مقدار و عضو سوم ويژه بردار متناظر است.

✓ اپراتور arbcomplex در يک expression بيانگر يک بخش اسکالر دلخواه در آن expression است.

• اپراتور nullspace: براي ماتريس a ليستي از بردارهاي مستقل خطي را حساب مي کند که ترکيب خطي آنها معادله ي ax=0 را ارضا مي کند.

nullspace(matrix-expression)

1: nullspace(mat((1,2,3,4), (5,6,7,8)));

[pic]

• اپراتور smithex: فرم نرمال smith را براي ماتريس A حساب مي کند و [pic] را برمي گرداند که : [pic]

smithex (,)

✓ ماتريسي بر حسب است.

1: a: = mat ((x,x+1), (0,3*[pic]2))$

2: smithex (a,x);

[pic]

اپراتورهاي ديگري از جمله smithex-int() ، frobenius()، jordan() و ... نيز کارکرد مشابهي دارند که به ترتيب فرم نرمال smith براي ماتريس با درايه هاي integer، فرم نرمال frobenius و فرم نرمال Jordan را براي ماتريس A حساب مي کنند و به ترتيب [pic]، [pic]و [pic]را برمي گردانند که [pic] [pic].

• add-columns (, , , ) : به ستون c2 از c1* را اضافه مي کند. add-rows هم کارکرد مشابهي براي سطرها دارد.

• add-to-columns (, , ) : به ستون هايي که در ليست مشخص شده اند، را اضافه مي کند. add-to-rows هم کارکرد مشابهي براي سطره دارد. دو اپراتور mult-columns و mult-rows با syntax مشابه همين کار را با عمليات ضرب (به جاي جمع) انجام مي دهند.

• augment-comlumns (, ): ستون هاي مشخص شده در لسيت از را نگه مي دارد و در ماتريس جديدي کنار هم قرار مي دهد. Stack-rows همين کار را براي سطرها انجام مي دهد.

• band-matrix (,) : سيني با تعداد اعضاي فرد است و band matrix يک ماتريس مربعي با سايز مي سازد و اين ليست را طوري در سطرهاي آن قرار مي دهد که عضو وسط هميشه روي قطر باشد:

1: band-matrixs ({x,y,z},4);

[pic]

• Char-matrix(,) : ماتريس مشخصه ي را بر حسب متغير مي سازد يعني c=*Id- که Id ماتريس واحد است.

• Char-poly (, ): معادله ي مشخصه ي را بر حسب متغير پيدا مي کند يعني دترمينان c=*Id- که Id ماتريس واحد است.

• Cholesky () : تجزيه ي cholesky را براي نمايش مي دهد. چيزي که برمي گرداند {L,U} است به طوري که A=LU و [pic]. در اين اپراتور درايه هاي ماتريس بايد حقيقي باشند. براي ماتريس با درايه هاي مختلط دستور lu-decom() را به کار مي‌بريم.

1: f: = mat((1,1,0), (1,3,1), (0,1,1)) $

2: on rounded;

3: cholesky (f);

[pic]

• Coeff-matrix ({}) : ليستي از معادلات است. اين اپراتور {C,X,B} را برمي گرداند به طوري که CX=B

1: coeff-matrix ({x+y+4*z=10, y+x-z=20, x+y+4});

[pic]

• Row-dim(), column-dim () ، ابعاد ستون و سطر را حساب مي کند.

• diagonal () : ماتريسي مي سازد که اعضاي روي قطر آن قرار دارند. اعضاي ممکن است اسکالر يا ماتريس باشند.

• extend (, , , ) : ماتريس را به اندازه ي سطر و ستون گسترش مي دهد و درايه هاي جديد را برابر با قرار مي دهد.

• get-columns (, ): ستون هايي که شماره ي آنها در ليست مشخص شده را به صورت ليستي از ماتريس هاي ستوني برمي گرداند. Ger-rows(matrix>,) همين کار را براي سطرها مي کند.

• tp(): ترانهاده ي را حساب مي کند.

• hermitian-tp(): براي ماتريس A، A+ را حساب مي کند.

• hesian(, ): ماتريس hessian را براي محاسبه مي کند و آن ماتريس n×n است (n: تعداد اعضاي ) که درايه ي (i,j) آن برابر است با df(,(i), (i) .

• hilbert(,): ماتريس مربعي Hilbert را براي محاسبه مي کند و آن ماتريس متقارني است که درايه ي (i,j) آن برابر است با [pic]

• jacobian (,): ماتريس ژاکوبي را براي (بر حسب متغيرهاي ( محاسبه مي کند که يک ماتريس m×n است: n تعداد متغيرها و m تعداد expression ها. درايه ي (i,j) آن برابر است با: df((i),(j))

1: jacobian[pic]

[pic]

• Jordan-block (,(size>) : ماتريس مربعي Jordan block را با ابعاد مي‌سازد درايه هاي اين ماتريس به اين شکل هستند:

J(i,j) = for i=1,…,n , J(I,i+1)=1 for i=1,…,n-1\

و بقيه ي درايه ها صفر هستند.

• make-identity (): ماتريس واحد را با ابعاد × مي سازد.

• matrix-augment() : ماتريس هاي را افقي کنار هم قرار مي دهد و يک ماتريس مي سازد. matrix-stack همين کار را به صورت عمودي انجام مي دهد.

Matrix(): اگر ماتريس باشد true بر مي گرداند و در غير اين صورت nil.

• Minor (, , ) : ماتريس جديدي مي سازد سطر و ستون از را در آن حذف کرده است.

• random-matrix(,,) : يک ماتريس × مي سازد که درايه‌هاي آن اعداد رندوم بين - و هستند. سويچ هاي زير نوع درايه ها را تعيين مي کنند:

imaginary (1 : اگر روشن باشد درايه ها به صورت x+iy خواهند بود که –limit>;>>;

10: christoffel(m,im,cr,c);

11: for i := 0:3 do>;>>;>>;

12: array r1(3,3,3,3),r2(3,3,3,3);

13: for i := 0:3 do>;>>;>>;

14: for i := 0:3 do>;>>;>>;>>;

15: kretchman := 0$

16: for i := 0:3 do;>>;>>;

شيوه ي اجراي اين کد را در شکل زير مي بينيد.

[pic]

[pic]

خط اول تعريف ماتريس g است که همان متريک شوارتس شيلد است. ; در انتهاي خط نتيجه را چاپ مي کند. ولي در بقيه ي خط ها وجود $ باعث مي شود که نتيجه روي صفحه چاپ نشود.

خط دوم تعريف ماتريس معکوس متريک است. در خط سوم آرايه هاي مورد نياز با ابعاد مناسب تعريف شده اند که به ترتيب متريک, معکوس متريک, مختصات, نمادهاي کريستوفل و تانسور انحنا را نمايش مي دهند. در خط چهارم ( که در واقع شامل چهار خط دستور است ) نام مختصات در آرايه ي c تعيين شده و در خط هشتم مقداردهي آرايه ي متريک و معکوس آن با استفاده از دارايه هاي ماتريس g و ig انجام مي شود.

در اين مرحله آماده ايم تا تابع مورد نياز براي محاسبه ي نمادهاي کريستوفل را تعريف کنيم. اين تابع را در خط نهم تحت عنوان christoffel(a,b,y,x) تعريف کرده ايم. ورودي هاي اين تابع به ترتيب آرايه هاي متريک, معکوس متريک, کريستوفل ( که قرار است در تابع مقداردهي شود ) و مختصات هستند ولي توجه کنيد لزومي ندارد که ورودي تابع به هنگام تعريف آن هم نام با کميت هاي مورد نظر ما باشند.

با صدا کردن اين تابع, بعد از تعريف آن, اجزاي آرايه ي cr بر اساس رابطه ي موجود براي محاسبه ي نمادهاي کريستوفل در يک حلقه ي for چهار متغيره مقداردهي مي شوند. اکنون مي توان با استفاده از نمادهاي کريستوفل تانسور انحنا را محاسبه کرد. اين کار را در خط 11 با استفاده از يک حلقه ي ديگر و با توجه به رابطه ي تانسور انحنا با نمادهاي کريستوفل انجام داده ايم.

براي محاسبه ي نرده اي کرچمن بايد عبارت [pic] را محاسبه کنيم. ولي بايد دقت کنيد که در تعريف آرايه ي انحنا چون با آرايه سروکار داريم و نه با يک تانسور, بين انديس بالا و پايين هيچ تفاوتي وجود ندارد. پس با توجه به اينکه در برنامه [pic] را حساب کرده ايم بايد با استفاده از متريک انديس ها را تنظيم کنيم. در خطوط 12 تا 14 در واقع همين کار را انجام داده ايم. در بسته ي atensor قانون جمع انيشتين تعريف شده است, بنابراين اين مشکل در آنجا وجود نخواهد داشت.

در نهايت, در خط سيزدهم محاسبه ي نرده اي کرچمن با استفاده از يک حلقه ي for کامل شده است. همان طور که مشاهده مي کنيد نرده اي کرچمن به درستي محاسبه شده است.

[pic]

[pic]

-----------------------

[1] Anthony Hearn

[2] John Fitch

[3] Herbert Melenk

[4] Winfried Neun

[5] Arthur Norman

[6] Eberhard Schr[pic]fer

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download