Akar persamaan non linier menggunakan Matlab

Saya menggunakan Matlab untuk mencari akar fungsi non-linier. Persamaannya panjang dan saya telah menggunakan .m lain untuk menyimpan fungsinya, seperti kodenya

function x_c = f_x_c(s,H,VA,Lo,qc,EA,NF,Sj,Fj)

if (s < 0) || (s > Lo);
    disp('The value of s is invalid')
    disp(['s = ' num2str(s)]);
    return
end

C1 = H/qc;
if NF == 0
    n = 0;
    sn = 0;
    sum_Fj = 0;
end
if NF >= 1
    Sj_Q = [0; Sj; Lo];
    %Determine n and sn if 0 <= s < Lo:
    if s < Lo
    STOP = 0;
    k = 0;
        while STOP == 0
        k = k + 1;
            if (s >= Sj_Q(k,1)) && (s < Sj_Q((k + 1),1))
            STOP = 1;
            end
        end
    n = k - 1;
    sn = Sj_Q(k,1);
    end

    %Determine n and sn if s = Lo:
    if s == Lo
        n = NF;
        sn = Sj(NF,1);
    end

sum_Fj = sum(Fj(1:n,1));
end


x_c = (H/EA)*s;
x_c = x_c + C1*asinh((qc*s - VA + sum_Fj)/H) + ...
- C1*asinh((qc*sn - VA + sum_Fj)/H);

for j = 1:n
    sk = Sj_Q((j + 1),1);
    sk_1 = Sj_Q(j,1);
    sum_Fj = sum(Fj(1:(j - 1)));
    x_c = x_c + ...
    + C1*asinh((qc*sk - VA + sum_Fj)/H) + ...
    - C1*asinh((qc*sk_1 - VA + sum_Fj)/H);
end

Variabelnya adalah H di sini. Tidak ada masalah dengan kode tersebut karena ia mengembalikan persamaan panjang itu kepada saya ketika saya mengetikkan yang berikut ini di file utama.

syms x
equation = -(XB - XA) + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj);  %Replaced H with variable H and all other arguments are pre-defined

Sekarang, saya ingin menyelesaikan persamaan ini mendekati H0. Ketika saya memasukkan fzero(@(x)equation, H0), itu memberi saya kesalahan seperti itu

Undefined function 'isfinite' for input arguments of type 'sym'.

Error in fzero (line 308)
    elseif ~isfinite(fx) || ~isreal(fx)

Error in main (line 50)
fzero(@(x)equation, H0)

Bagaimana cara mengatasi masalah ini?

EDIT:

Persamaan memiliki setidaknya satu akar karena jika saya menggunakan ezplot untuk memplot fungsinya, saya mendapatkan gambar berikut.masukkan deskripsi gambar  di sini


person India Slaver    schedule 02.12.2014    source sumber
comment
@patrik Tidak, saya tidak punya variabel seperti itu. Faktanya, di fzero.m, ada satu baris yang memiliki isfinite. Baris itu berbunyi seperti if any(~isfinite([fa fb])) || any(~isreal([fa fb]))   -  person India Slaver    schedule 02.12.2014
comment
Maaf, kesalahanku. Namun, saya telah mencoba mereproduksi kesalahan dengan fungsi yang lebih sederhana, tetapi saat ini saya tidak dapat mereproduksi kesalahan tersebut. Baris function x_c = equation = XB - XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj); juga tidak dapat dijalankan. Bolehkah saya bertanya apa yang ingin Anda lakukan? Apakah Anda memiliki file fungsi yang mengambil masukan dan memberikan keluaran, yang ingin Anda cari akarnya?   -  person patrik    schedule 02.12.2014
comment
@patrik Ya, Sj dan Fj harus berupa matriks dalam fungsinya, itu sebabnya kode Anda mungkin tidak berjalan. Kodenya terlalu besar! Apakah Anda ingin saya memposting semuanya di sini?   -  person India Slaver    schedule 02.12.2014
comment
Tidak, lebih baik tidak. Tapi yang saya maksud adalah syms x; function x_c = equation = XB - XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj); Harus memberikan kesalahan kompilasi. Ketiga, apakah kotak alat simbolis benar-benar diperlukan di sini?   -  person patrik    schedule 02.12.2014
comment
@patrik Jika saya hanya menulis itu, kodenya berfungsi dengan baik. Masalah terjadi ketika saya menggunakan fungsi fzero. Jika saya menggunakan disp(x_c), ini menunjukkan persamaan besar yang ingin saya pecahkan.   -  person India Slaver    schedule 02.12.2014
comment
Tapi syms x; function x_c = equation = XB - XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj); ini tidak bisa seperti yang terlihat, karena ini memberikan kesalahan kompilasi. Kata kunci function tidak berfungsi seperti ini! Selain itu, x_c = equation = XB... bukanlah sintaks yang benar. Jika Anda memerlukan bantuan, berikan contoh kode yang berfungsi. Saya tahu apa masalahnya, tetapi kecuali saya tidak tahu persis bagaimana Anda mendapatkan kesalahan tersebut, saya tidak akan dapat membantu Anda dengan cara yang baik. Saya dapat mengatakan bahwa Anda perlu menulis ulang kode dengan cara yang benar-benar berbeda, yang berhasil, tetapi menurut saya ini bukan pilihan bagi Anda.   -  person patrik    schedule 02.12.2014
comment
@patrik x_c = equation = XB... ada kesalahan di sini. Saya tidak menyadarinya. Itu benar dalam kode saya. Ada 5 file kode. Haruskah saya posting semuanya di sini? Atau bisakah saya menghubungi Anda di tempat lain? Tolong bantu saya!   -  person India Slaver    schedule 02.12.2014
comment
@patrik Silakan lihat grafik persamaannya. Pasti melintasi sumbu x satu kali.   -  person India Slaver    schedule 02.12.2014


Jawaban (2)


Begitu, saya sampai di tempat yang hampir sama dengan Anda, namun saya sampai ke baris 309, karena ternyata menggunakan isfinite pada sym tidak menyebabkan crash di matlab 2014b. Namun, isfinite mengembalikan false, masih memberikan kesalahan. Tapi to the point: sepertinya fzero tidak seharusnya digunakan untuk simbol. Apakah Anda yakin simbol diperlukan di sini? Melihat pemanggilan fungsi sepertinya tidak diperlukan, karena outputnya sepertinya berupa numerik. Anda juga mungkin berpendapat demikian

syms x; fzero(@(x) x^2-1,1)

berfungsi, tetapi x di @(x) memiliki prioritas lebih tinggi yang bukan merupakan simbol (dalam pemrograman kita mengatakan bahwa variabel memiliki cakupan yang berbeda).

Jika penting bahwa x adalah sym, Anda harus menggunakan pemecah persamaan solve yang berfungsi untuk keluaran simbolis.

syms x;
equation = x^2-3;
solve(equation,'x')

Namun, ini mungkin gagal atau memberi Anda jawaban yang sangat panjang untuk fungsi yang rumit (dan juga untuk ekspresi yang tidak memiliki jawaban pecahan yang bagus, coba syms x; equation = x^3-3.17+1.37*x;). Ini juga lebih lambat dan oleh karena itu tidak disarankan jika Anda tidak memiliki konstanta arbitrer dalam ekspresi (misalnya f = x^2-a ‹=> x = +- a^(1/2), di mana a harus didefinisikan nanti atau Anda ingin melakukan sesuatu pada solusi untuk beberapa nilai a).

person patrik    schedule 03.12.2014

Saya tidak tahu apa yang menyebabkan masalah ini karena saya tidak familiar dengan paket simbolik di Matlab.

Namun Anda seharusnya bisa menyelesaikannya dengan cukup mudah menggunakan beberapa pemecah numerik. Dari apa yang saya baca dari kode Anda, Anda ingin menyelesaikan persamaan di atas sama dengan nol, inilah yang sedang dilakukan Newton Rhapson. Anda dapat mencari metodenya di sini: http://en.wikipedia.org/wiki/Newton 's_metode

Karena Anda mungkin tidak mengetahui turunan pasti dari fungsi Anda, Anda dapat memperkirakannya menggunakan pendekatan orde pertama, di mana Anda cukup menggunakan definisi diferensial tetapi karena kami tidak dapat membiarkan h menjadi 0, kami memilih h sangat kecil, di matlab saya biasanya menggunakan sqrt(eps). Sehingga perkiraannya menjadi: f'(x) = (f(x+sqrt(eps))-f(x))/sqrt(eps).

Jika tidak, Anda dapat menggunakan metode saya, yang berfungsi dalam 1 dimensi, Anda dapat menemukannya di sini: http://imada.sdu.dk/~nmatt11/MM533-2014/ Anda harus mengunduh fpisimple.m dan mynewton.m karena metode newton hanyalah sebuah aplikasi iterasi titik perbaikan yang dibuat di atasnya.

person Nicky Mattsson    schedule 02.12.2014
comment
Itu tidak berhasil. Tunjukkan kesalahan ini kepada saya: Error using sym/subsref (line 9) Error using maplemex Error, (in MTM:-subsref) indices must be positive integers, got 229396153.846153855 Error in mynewton>@(x)x-f(x)/fprime(x) (line 8) g = @(x) x - f(x)/fprime(x); Error in fpisimple (line 9) x=f(x); Error in mynewton (line 11) x = fpisimple(g,x0,tol); Error in main (line 51) mynewton(equation,H0,100) - person India Slaver; 02.12.2014