حل معادله درجه سوم

حل معادله درجه سوم

حل معادله درجه سوم خط به خط به این صورت انجام می شود:

1- ابتدا معادله به شکلی مناسب تغییر داده می شود تا یکی از متغیرها حذف شود. معمولا بهترین شیوه برای انجام این کار، ضرب کردن یک طرف معادله به متغیرهائی است که می خواهیم آنرا حذف کنیم.

2- در مرحله بعد، متغیرهائی که حذف شد را دوباره میتوانیم در معادله جایگزین کنیم و از جدیدترین معادله استفاده کنیم تا ریشه ها بدست آیند برای این کار، می توانیم از فرمول زیر استفاده کنیم:

x = (-b ± √(b^2 – 3ac)) / (3a)

که در آن a ، b و c مقادیر ثابت متغیرها در معادله هستند.

3- در نهایت ریشه یابی انجام شده به دست آمده را با معادله مقایسه می کنیم تا ریشه های نهایی تایید شوند. یعنی ریشه ها را در معادله جاگذاری میکنیم و مطمئن میشویم که جواب صفر بدست آید.

ریشه هایی که می توانند به صورت ارقام ساده (مانند 1, 2, 3) بیان شوند، ریشه اصلی نامیده می شوند.

برای مثال اگر معادله x^3 + 5*x^2 – 7*x – 6 = 0 باشد، ریشه x = 1 یک ریشه اصلی است.

ریشه هایی که نمی توانند به صورت ارقام ساده بیان شوند، و بصورت مختلط نوشته میشوند، ریشه فرعی نامیده می شوند.

در معادله درجه سه، دو نوع ریشه وجود دارد: ریشه اصلی و ریشه فرعی. ریشه اصلی فقط ارزش حقیقی دارد در حالی که ریشه فرعی میتواند هم ارزش حقیقی و هم مختلط داشته باشد.

در هر صورت ؛

با کمک ماژول math  و Numpy و  matplotlib و با در نظر گرفتن اعداد فرضی برای ثابتهای a,b,c,d  میتوانیم از کد زیر برای حل معادله و رسم نمودار آن استفاده کنیم :

import math
import numpy as np
import matplotlib.pyplot as plt

# Define the variable symbol
x = 0.0

# Define the cubic polynomial
p = lambda x: x**3 + 5*x**2 - 7*x - 6

# Solve for roots using math library
roots_math = []

# Calculate the discriminant
discriminant = pow(5, 2) * pow(-7, 3) + (pow(-6, 1) * 7) * 5
if(discriminant < -10):
    print("The equation has no real roots")
else:
    # Calculate the solutions using the math library
    root1 = (-5 + math.sqrt(abs(discriminant)))**(1/3)
    root2 = (-5 - math.sqrt(abs(discriminator)))**(1/3)

    # Add the complex roots to the list of roots
    for i in range(0, 2):
        if(i == 0):
            roots_math.append(-root1 + root2)
        else:
            roots_math.append(root1)

    # Find the points where the curve intersects with the x-axis
    intersection_points = [root for root in roots_math if p(root) == 0]

    print("Intersection points:", intersection_points)

# Plot the graph of the cubic polynomial
x_values = np.linspace(-10, 10, 400)
y_values = [p(x) for x in x_values]
plt.plot(x_values, y_values)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Cubic Polynomial Graph')

# Draw vertical lines at each root
for root in roots_math:
    plt.axvline(root, color='r')

# Draw horizontal line at the origin (0, 0)
plt.axhline(y=0, color='k', linestyle='--')

plt.show()

و چنین تصویری را تولید می کند:

و جواب نهایی اش این استکه : این معادله ریشه حقیق ندارد و نمیتواند ریشه های آنرا بطور دقیق حساب کند.

پس میرویم سراغ sympy  تا بهترین روش حل معادله را پیدا کنیم .

اما کتابخانه sympy برای حل این معادله چه راههایی را امتحان کرده است ؟

  1. در مرحله اول، کتابخانه sympy سعی می کند تا معادله را با استفاده از فاکتور گرفتن و ریشه یابی حل کند.

برای مثال، اگر معادله x^3 + 5*x^2 – 7*x – 6 باشد، کتابخانه sympy سعی می کند تا آنرا به شکلی مانند (x – a)*(x – b)*(x – c) تجزیه کند.

  1. در مرحله دوم، اگر معادله هنوز حل نشده بود، کتابخانه sympy از روش های ریشه یابی عددی استفاده می کند.

برای مثال، کتابخانه sympy می تواند از روش فون گالبر (Fon Galber method) یا روش نیوتن رافسون (Newton-Raphson method) استفاده کند.

  1. در مرحله سوم، اگر معادله هنوز حل نشده بود، کتابخانه sympy سعی می کند تا آنرا به شکلی ساده تر تبدیل کند.

برای مثال، کتابخانه sympy می تواند از پالمودیفیکاسیون (Polymodification) استفاده کند.

  1. در مرحله چهارم، اگر معادله هنوز حل نشده بود، کتابخانه sympy از فرمول کاردو (Cardano’s formula) استفاده می کند. این فرمول یک روش دقیق و صحیح برای حل معادله درجه سه است.

کتابخانه sympy پایتون مراحل پله به پله را طی می کند تا هر چه سریعتر معادله راحل کند و به نتیجه برساند.

کد زیر را برای sympy نوشته ام تا معادله درجه 3 را حل کرده و نمودارش را هم رسم کند.

import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols, Eq, solve

# Define the variable symbol
x = symbols('x')

# Define the equation
eq = Eq(x**3 + 5*x**2 - 7*x - 6, 0)

# Solve for roots using Sympy
roots = solve(eq, x)
print("Roots:", roots)

# Plot the graph of the cubic polynomial
x_values = np.linspace(-10, 10, 400)
y_values = [eval(str(x**3 + 5*x**2 - 7*x - 6)) for x in x_values]
plt.plot(x_values, y_values)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Cubic Polynomial Graph')

# Ensure the x-axis passes through the origin (0)
plt.axhline(0, color='k')
# Draw vertical lines at each root
for root in roots:
    plt.axvline(root, color='r')

plt.show()

 

و میبینیم که دقیقا نمودار در 3 نقطه محور x  ها را قطع کرده و این کد بسیار مناسبی بنظر می رسد چون توانسته همه انتظارات ما را برآورده کند. آفرین    sympy  !!!!

==============================

مثال دوم:

معادله درجه سوم x^3 + 2x^2 – x – 1 = 0 می باشد.

برای حل این معادله، ابتدا آنرا به شکلی مناسب تغییر می دهیم:

x^3 – x^2 + 2x – 1 = 0

حال متغیر -x را حذف کرده و دوباره در معادله جایگزین کنیم تا ریشه یابی انجام شود:

(x-1) ^3-3(x-1) ^2+2(x-1)-1=0

حال ریشه یابی به دست آمده می باشد. برای یافتن ریشه اصلی معادله، از فرمول زیر استفاده کنیم:

x = (-1 ± √(1^2 – 4*1*(-1))) / (3*1) = 0

اعداد 1- و 1 ریشه های اصلی معادله فوق خواهند بود.

و ریشه اصلی معادله درجه سوم x^3 + 2x^2 – x – 1 = 0 می باشد.

این روش حل معادله درجه سوم به خط به خط می تواند برای حل معادله های درجه سوم مختلف استفاده شود.

 

برای حل این معادله ؛ ابتدا تجزیه اش میکنیم :

 (x-1)^2(x+1) = 0

مراحله تجزیه معادله فوق به صورت زیر است:

از تکنیک «فاکتور گرفتن از گروه» استفاده می‌کنیم.

مرحله اول: معادله اصلی را بنویسید: x^3 – 2x^2 + x – 1
مرحله دوم: دو عبارت را که یک عامل مشترک دارند پیدا می کنیم. در این مورد، می‌توانیم دومین عبارت را به -2(x-1)^2 + x – 1 تبدیل کنیم با استفاده از تکنیک فاکتور گرفتن.
مرحله سوم: حالا معادله به صورت `x^3 – (x-1)^2 + x – 1` در می‌آید
مرحله چهارم: باید توجه کنیم که عبارت‌های باقی مانده دارای عامل مشترک `x+1` هستند. پس می‌توانیم این دو عبارتی را ترکیب کرده و به x(x+1) – (x-1)(x+1)  تبدیل کنیم.
مرحله پنجم: نهایتاً عمل ساده سازی انجام میدهیم و نتیجه این می شود :

(x-1)^2(x+1) = 0

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

import sympy as sp
import matplotlib.pyplot as plt

# Define the variable symbol
x = sp.symbols('x')

# Define the cubic polynomial
p = x**3 - 2*x**2 + x - 1

# Solve for roots using Sympy
roots_sympy = sp.solve(p, x)
print("Roots:", roots_sympy)

# Plot the graph of the cubic polynomial
x_values = [float(i) for i in range(-10, 11)]
y_values = [p.evalf(subs={'x':i}) for i in x_values]
plt.plot(x_values, y_values)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Cubic Polynomial Graph')

# Set the y-axis range
plt.ylim(-400, 400)

# Draw horizontal line at the origin (0, 0)
plt.axhline(y=0, color='k', linestyle='--')

# Draw vertical lines at each root
for root in roots:
    plt.axvline(root, color='r')
# Show the plot
plt.show()

جواب چنین بدست می آید:

و اینم شکل بزرگتری از منحنی

error: لطفا دانلود نفرمائید !!