2013-11-18 2 views
0

Я хочу решить одно трансцендентное уравнение численно. Я использовал функцию «решить» для решения, но мои результаты различаются по сравнению с графическим решением. Мой код написан ниже, и я отправляю результаты графического решения.Решение трансцендентного уравнения по численному методу

clear all; 
n1=1.77; 
n2=1.45; 
d=1e-6; 
lambda = 1e-6; 
ko = 2*pi/lambda; 
A=(ko*n1)^2; 
B=(ko*n2)^2; 
r=(ko*d)*sqrt(n1^2-n2^2); 
syms h; 
s=((h*d)-m*pi) == 2*atan(sqrt(r^2/(h^2*d^2)-1)); 
solve (s) 
prop=sqrt(A-ans^2); 
neff=(prop*lambda)/(2*3.14) 

где m будет varries от 0 до 2.0 с интервалом 0,5. Графические результаты: m = 0 neff равно 1.7299, но графическое решение составляет 1,75 м = 0,5 нефф 1,678, но графическое решение 1,71 м = 1,0 нефф составляет 1,608, но графическое решение 1,65 м = 1,5 нефф составляет 1,523, но графическое решение составляет 1,55 м = 2.0 neff равен 1.451, но графическое решение - 1.452.

Может кто-нибудь, пожалуйста, помогите мне и скажите мне о вине? Также есть ли какая-либо другая функция вместо «решить».

Спасибо.

+0

Вы отметили эти численные методы, но используете символическую математику ('syms' и' solve'). Если вы пытаетесь получить числовое решение, вы, вероятно, должны использовать численный корневой искатель: 'fzero' для 1-D. Если вы используете 'solve', вы должны заменить' pi' на 'sym (pi)'. Также должен ли '3.14' на последней строке на самом деле быть' pi'? – horchler

+0

благодарит за ответ, но поскольку я плохо разбираюсь в программировании, не могли бы вы рассказать мне, как это сделать с помощью fzero, поскольку я пытаюсь и получаю ошибки :( – Rizwan

ответ

0

В принципе, вам нужно сделать что-то вроде

fun = @(hd) ((hd)-m*pi)-2*atan(sqrt(r^2/(hd^2)-1)); 
fsolve(fun, 1.) 

, где я решил для комбинированного значения hd=h*d, чтобы избежать ошибок округления в терминах h*d-m*pi и sqrt(r^2/(hd^2)-1).

 Смежные вопросы

  • Нет связанных вопросов^_^