2744557306 发表于 2023-12-31 16:02

matlab脚本进行连续函数的最佳逼近

这是一个 MATLAB 脚本,用于进行连续函数的最佳逼近。脚本实现了对一般形式的连续函数的逼近,用户可以指定原函数、定义域以及逼近的最大次数。以下是对代码的主要部分的解释:
function fe = fitfun()
    % 连续函数的最佳逼近
    % 取基{1, x, ...}

    % 默认算例为课本:P60,例3.1
    % 原函数f(x)=x^(1/2),定义域
    % 结果:P(x) = 10/27 + 88/135x  平方误差=0.00010803

    % 输入原函数
    fs = input('<连续函数的最佳逼近>\n输入原函数f(x):[直接回车表示:f(x)=x^(1/2)]\nf(x)=', 's');
    if isempty(fs)
        fs = 'x^(1/2)';
    end
    f = sym(fs);

    % 输入定义域上下界
    a = input('定义域() 上界a:');
    b = input('Domain () 下界b:');

    % 输入逼近的最大次数
    n = input('{1, x, x^2, ..., x^n}\nInput the maximum index n: ');

    % 创建向量
    v = vv(n);
    h = vh(n);

    % 计算矩阵 G 和向量 B
    G = int(v * h, a, b);
    B = int(f * v, a, b);

    % 计算系数矩阵 C
    C = inv(G) * B;

    % 计算逼近多项式
    fe = h * C;

    % 误差
    SError = vpa(int(f * f, a, b) - int(f * h, a, b) * C, 6);

    % 绘制原函数和逼近函数
    x = a:(b-a)/100:b;
    y = subs(f, x);
    plot(x, y, 'r');
    hold on;
    y = subs(fe, x);
    plot(x, y);

    % 输出误差
    disp(['误差: ', char(SError)]);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v = vv(n)
    % 创建垂直向量,如
    % 1
    % x
    % x^2
    % ...
    % x^n

    if (n < 0 || n > 9)
        error('请确保 ''n'' 在 范围内');
    end

    s = '';
    for i = 0:n
        s = strcat(s, ';x^');
        s = strcat(s, num2str(i));
    end
    s(1) = '[';
    sz = size(s);
    s(sz(2) + 1) = ']';

    v = simplify(sym(s));
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v = vh(n)
    % 创建水平向量,如
    %

    if (n < 0 || n > 9)
        error('请确保 ''n'' 在 范围内');
    end

    s = '';
    for i = 0:n
        s = strcat(s, ',x^');
        s = strcat(s, num2str(i));
    end
    s(1) = '[';
    sz = size(s);
    s(sz(2) + 1) = ']';

    v = simplify(sym(s));
end

这个脚本首先要求用户输入原函数、定义域以及逼近的最大次数。然后,它构建了基函数向量和水平向量,计算了系数矩阵 C,并绘制了原函数和逼近函数的图表。最后,输出了逼近误差。


页: [1]
查看完整版本: matlab脚本进行连续函数的最佳逼近